C++ 在a#define宏名中可以使用a.b符号吗?

C++ 在a#define宏名中可以使用a.b符号吗?,c++,c,visual-studio,visual-c++,c-preprocessor,C++,C,Visual Studio,Visual C++,C Preprocessor,我想使用Visual Studio 2008或2010声明一个定义,如下所示: #define a.b c.d 我得到以下错误: 错误C2008:“.”:宏定义中出现意外错误 我看到我被允许创建这样的定义: #define a c.d 宏名称中是否允许使用a.b符号?宏与标识符具有相同的命名规则集。实际上,宏名称是标识符 所以 它们不能包含点 它们只能由字母、数字和下划线组成。没有别的了。但是,它们不能以数字开头 改为做以下事情怎么样 #define a c #define b d 如果

我想使用Visual Studio 2008或2010声明一个定义,如下所示:

#define a.b c.d
我得到以下错误:

错误C2008:“.”:宏定义中出现意外错误

我看到我被允许创建这样的定义:

#define a c.d

宏名称中是否允许使用
a.b
符号?

宏与标识符具有相同的命名规则集。实际上,宏名称是标识符

所以

  • 它们不能包含点
  • 它们只能由字母、数字和下划线组成。没有别的了。但是,它们不能以数字开头

改为做以下事情怎么样

#define a c
#define b d

如果你使用C++,除非绝对必要,否则不要使用宏——C++给你更好的机制。请添加一些范围或环境,在其中使用你的<代码>定义> <代码>。你很幸运,MSV正确告诉你它是一个无效的宏定义。在C89中,可以认为宏的标识符是
a
,替换文本以第一个
开头。GCC显示
警告:宏名称后缺少空格
。然而,ISO/IEC 9899:2011标准的§6.10.3¨3规定“在类似宏的对象定义中,标识符和替换列表之间应存在空白”(C99类似;C89未说明)。所以,GCC是宽容的:它给出了一个诊断警告,这是兼容编译器所需要的。我想映射其他编译器的两个结构,而这个定义对我没有帮助。我理解,但这是避免这一规则的一种方法?@SerbanLupu除非您想创建自己的预处理器,以便在将代码发送给编译器之前检查代码。这毕竟是一条规则。