您可以在#define 宏名称中使用 a.b 表示法吗?
Posted
技术标签:
【中文标题】您可以在#define 宏名称中使用 a.b 表示法吗?【英文标题】:Can you use a.b notation in a #define macro name? 【发布时间】:2011-11-07 17:44:11 【问题描述】:我想声明一个定义,使用 Visual Studio 2008 或 2010,像这样:
#define a.b c.d
我收到以下错误:
错误 C2008:“。” : 宏定义中的意外
我发现我可以创建这样的定义:
#define a c.d
a.b
符号是否应该允许在宏名称中?
【问题讨论】:
如果您使用 C++,除非绝对必要,否则不要使用宏 - C++ 为您提供更好的机制 请添加一些您的#define
将在其中使用的范围或环境。
您很幸运,MSVS 正确地告诉您它是无效的宏定义。在 C89 中,可能会争辩说宏的标识符是 a
,而替换文本以第一个 .
开头。 GCC 说warning: missing whitespace after the macro name
。但是,ISO/IEC 9899:2011 标准的§6.10.3 ¶3 说“在类对象宏的定义中,标识符和替换列表之间应有空格”(C99 类似;C89 没有说明)。所以,GCC 是宽松的:它给出了一个诊断警告,这是兼容编译器所需要的。
【参考方案1】:
宏和标识符有相同的命名规则。事实上,宏名是标识符。
所以,
它们不能包含点。 它们可以仅由字母、数字和下划线组成。没有其他的。但是,它们不能 以数字开头。【讨论】:
我明白,但这是避免这条规则的一种方式? @SerbanLupu 除非您想创建自己的预处理器来处理您的代码,然后再将其发送给编译器,否则不会。毕竟这是一个规则。【参考方案2】:不如做下面的事情?
#define a c
#define b d
【讨论】:
我想映射其他的 2 个结构,这个定义对我没有帮助。以上是关于您可以在#define 宏名称中使用 a.b 表示法吗?的主要内容,如果未能解决你的问题,请参考以下文章