您可以在#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 表示法吗?的主要内容,如果未能解决你的问题,请参考以下文章

c/c++中define用法详解及代码示例

宏定义

typedef 和 #define 的区别

第八章 编译预处理

ztree怎么设置点击节点展开

php中const和define的区别