为什么我不能在C中使用#define作为关键字?

ban*_*run 2 c c++ macros macrodef

我正在尝试在C++中使用以下代码.有人能告诉我为什么会出现错误吗?

#define  def namespace;
using def std;
int main(){
return 0;
}
Run Code Online (Sandbox Code Playgroud)

而以下代码工作正常

#define  def namespace std;
using def;
int main(){
return 0;
}
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 16

这是因为嵌入的分号:

#define  def namespace;
                      ^
                      |
                     WHOA!
Run Code Online (Sandbox Code Playgroud)

请注意,#define它本身不需要分号来终止定义,因此如果您使用它,它将成为将在使用宏的任何位置插入的文本的一部分.

在预处理之后,第一个示例将该using行转换为:

using namespace; std;
Run Code Online (Sandbox Code Playgroud)

显然有句法问题.

解决方法是删除行中的尾随分号#define,如下所示:

#define def namespace
Run Code Online (Sandbox Code Playgroud)

您应该弄清楚如何使用编译器读取预处理代码,在理解宏引起的混淆时总是有益的.

  • @MarkGarcia:当您遇到预处理器时遇到问题,如果您可以调用它并查看其输出,则值得一看.例如,使用GNU的gcc,你可以说像`gcc -E program.cc | less`.您将能够看到生成的代码是否符合您的期望,以及后续编译阶段正在处理的代码. (7认同)