【发布时间】:2019-02-06 09:17:45
【问题描述】:
我正在浏览一个微控制器的头文件,当我发现这个时,
#define DEFA(name, address) __no_init union \
{ \
struct \
{ \
volatile unsigned char name##_L; \
volatile unsigned char name##_H; \
}; \
struct \
{ \
volatile unsigned short name##L; \
volatile unsigned short name##H; \
}; \
__ACCESS_20BIT_REG__ name; \
} @ address;
我有多个问题,
- 我不知道我们可以在#define 语句中使用联合和结构。编译器如何解释它们?
- “name##_L”和“name##L”是什么意思?,尤其是“##”。
- 什么是“__ACCESS_20BIT_REG__ 名称”?
- 这个新的“@”符号是什么,我用谷歌搜索了这个符号,我在任何地方都找不到与 @ 符号相关的东西,有人说这不是 C 标准,这是真的吗?是什么意思?
有人,请给我解释一下这段代码,一切都依赖于这段代码,一切都直接或间接地使用了这个#define。 :(
【问题讨论】:
-
"##" 是 C 预处理器的标记连接功能:en.wikipedia.org/wiki/C_preprocessor#Token_concatenation
-
我不知道我们可以在#define 语句中使用联合和结构。编译器如何解释它们? - 您可以在预处理器符号定义中使用您想要的任何文本。预处理器所做的只是(相当)愚蠢的文本替换。
-
@Swordfish:宏替换替换预处理器标记,而不是文本,# 和 ## 运算符除外。
-
@EricPostpischil 到目前为止我看到的所有预处理器标记都是文本 ^^
-
@Swordfish:如果宏替换替换了文本,那么宏中的
X-4可能会变成浮点文字3e-4。这不可以。代币替换不能形成新的代币。初始词法分析已经执行,不再重复。
标签: c embedded c-preprocessor preprocessor