在CMake for Visual Studio 2010中定义宏“禁止复制和分配”

时间:2012-12-07 16:36:47

标签: c++ visual-studio-2010 macros cmake

到目前为止,现有的C ++多项目在QT中使用了CMake 2.8。我们希望继续在Visual Studio 2010中维护它。我使用选项-G "Visual Studio 10"在CMake中生成Visual Studio项目,但现在由于以下原因我无法编译它们:

在项目中,我们使用一个众所周知的宏,其本身在this question中进行了讨论。

#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
  TypeName(const TypeName&);   \
  void operator=(const TypeName&)

宏在CMake中定义,以便将其作为预处理器定义提供给编译器(cl.exe):

add_definitions(-DDISALLOW_COPY_AND_ASSIGN\(TypeName\)=\" TypeName(const TypeName&)\; void operator=(const TypeName&)\; \")

Visual Studio不接受CMake的输出,并在代码中使用宏的任何地方抛出编译错误。什么是正确的语法,以便CMake可以为Visual Studio 2010正确生成它?

2 个答案:

答案 0 :(得分:2)

我建议你不要使用宏,特别是这种情况。如果你可以使用boost,你可以私下继承boost::noncopyable。如果不这样做,您可以定义自己的:

class noncopyable {
   noncopyable(noncopyable const &);
   void operator=(noncopyable const&);
protected:
   noncopyable();
};

class Use : noncopyable
{
...

如果您坚持使用宏,请阅读将预处理代码转储到文件中所需的标志的编译器文档,并查看宏扩展到的内容。从那里你可以试着弄清楚出了什么问题。

答案 1 :(得分:2)

无法在cl的命令行上定义函数式宏。您可以通过在头文件中使用宏定义并使用cl的命令行选项/ FI传递此头文件来解决此问题。或者只是在必要时手动包含它(这可能更干净)。