编译器错误:使用g ++编译时,宏中没有"命名类型"

Zin*_*gam 3 c++ macros

我正在尝试创建一个宏来删除副本并移动类的构造函数.这段代码无法在GCC 4.8.2上编译".它有什么问题?如果我将所有内容放在一行上,代码就会编译.

#define DISALLOW_COPY_AND_MOVE(ClassName)                   \
    ClassName(const ClassName&) KEYWORD_DELETE;             \  // Copy constructor
    ClassName& operator=(const ClassName&) KEYWORD_DELETE;  \  // Copy assignment operator
    ClassName(ClassName &&) KEYWORD_DELETE;                 \  // Move constructor
    ClassName& operator=(ClassName&&) KEYWORD_DELETE;          // Move assignment operator
Run Code Online (Sandbox Code Playgroud)

第二行不会发出编译器错误,但最后三行不会.

KEYWORD_DELETE只是:

#if defined CPP11
    #define KEYWORD_DELETE = delete
#else
    #define KEYWORD_DELETE
#endif // defined CPP11
Run Code Online (Sandbox Code Playgroud)

这是输出:

In file included from ..\ObjectSlicing\src\main.cpp:5:0:
..\ObjectSlicing\src\__rm_utilities__/__rm_utilities__.h:26:5: error: stray '\' in program
     ClassName& operator=(const ClassName&) KEYWORD_DELETE;  \  // Copy assignment operator
     ^
..\ObjectSlicing\src\__rm_utilities__/__rm_utilities__.h:27:5: error: stray '\' in program
     ClassName(ClassName &&) KEYWORD_DELETE;                 \  // Move constructor
     ^
In file included from ..\ObjectSlicing\src\__include__/animals:5:0,
                 from ..\ObjectSlicing\src\main.cpp:6:
..\ObjectSlicing\src\__include__/../animals/cat.h:28:5: error: stray '\' in program
     DISALLOW_COPY_AND_MOVE(Cat)
     ^
In file included from ..\ObjectSlicing\src\__include__/animals:6:0,
                 from ..\ObjectSlicing\src\main.cpp:6:
..\ObjectSlicing\src\__include__/../animals/dog.h:28:5: error: stray '\' in program
     DISALLOW_COPY_AND_MOVE(Dog)
     ^
In file included from ..\ObjectSlicing\src\main.cpp:5:0:
..\ObjectSlicing\src\__rm_utilities__/__rm_utilities__.h:26:5: error: 'ClassName' does not name a type
     ClassName& operator=(const ClassName&) KEYWORD_DELETE;  \  // Copy assignment operator
     ^
..\ObjectSlicing\src\__rm_utilities__/__rm_utilities__.h:27:14: error: expected constructor, destructor, or type conversion before '(' token
     ClassName(ClassName &&) KEYWORD_DELETE;                 \  // Move constructor
              ^
..\ObjectSlicing\src\__rm_utilities__/__rm_utilities__.h:28:5: error: 'ClassName' does not name a type
     ClassName& operator=(ClassName&&) KEYWORD_DELETE;          // Move assignment operator
     ^
Run Code Online (Sandbox Code Playgroud)

eca*_*mur 7

你没有发现error: stray '\' in program

插入符号位于错误的位置; 它应该指向反斜杠:

..\ObjectSlicing\src\__rm_utilities__/__rm_utilities__.h:26:5: error: stray '\' in program
     ClassName& operator=(const ClassName&) KEYWORD_DELETE;  \  // Copy assignment operator
                                                             ^ -- here
Run Code Online (Sandbox Code Playgroud)

你不能//在反斜杠行继续符之后发表评论; 如果你想在宏中嵌入注释,你需要使用/* */注释并将它们放在反斜杠之前.