2

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

在项目中,我们使用了一个众所周知的宏,例如在这个问题中讨论了它。

#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 正确生成它?

4

2 回答 2

2

我建议您一般不要使用宏,尤其是在这种情况下。如果可以使用 boost,则可以私下继承自boost::noncopyable. 如果你不这样做,你可以定义你自己的:

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

class Use : noncopyable
{
...

如果您坚持使用宏,请阅读编译器文档作为将预处理代码转储到文件中所需的标志,并查看宏扩展为什么。从那里您可以尝试找出问题所在。

于 2012-12-07T16:43:13.837 回答
2

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

于 2012-12-07T16:45:19.627 回答