当我发现这个时,我正在浏览一个微控制器的头文件,
#define DEFA(姓名,地址)__ no_init union \{\ 结构 {\ volatile unsigned char name ## _ L; \ 不稳定……
我不知道我们可以在#define语句中使用union和结构。它们如何被编译器解释? 醇>
定义语句只是宏。它们不是由编译器解释,而是由预处理器解释。宏中定义的那段代码只是在任何地方进行了复制粘贴,您可以在其中调用/使用该宏。如果它包含有效的C / C ++代码,那么一旦预处理器完成,它也将在下一步编译。
“name ## _ L”和“name ## L”是什么意思。?,特别是“##”。 醇>
是的,我对此感到惊讶 ## 曾几何时。它是令牌连接。基本上,您可以使用它生成“以编程方式”的变量/函数名称。所以,例如,你有,
##
#include <stdio.h> #define concat(a, b) a##b int main(void) { int foobar = 1; printf("%d", concat(foo, bar)); return 0; }
会打印 1 ,因为它 的 符连接 强> foo 和 bar 一起形成 foobar 。
1
foo
bar
foobar
什么是 ” __ACCESS_20BIT_REG__ name “? 醇>
__ACCESS_20BIT_REG__ name
__ACCESS_20BIT_REG__ 似乎是一个 实现定义 宏可能在代码中的其他地方定义。该 __ 双下划线后跟一个大写保留用于实现(例如,您的uC制造商可以使用它们)。
__ACCESS_20BIT_REG__
__
什么是这个新的“@”符号,我用Google搜索了解这个符号,我发现任何地方都没有与@符号有关,有人说这不是C标准,这是真的吗?它是什么意思? 醇>
这个让我也难过。我不认为这是合法的C.
的 编辑: 强>
实际上,关于你的观点4即 @ 同性恋,我搜索了一些,发现了这一点 stackoverflow问题 。
@
我认为解释这段代码的最好方法是尝试一个例子: 那么定义的结果是什么 DEFA(name, address) ?
DEFA(name, address)
使用定义例如 DEFA(myName, myAddress) 预处理器创建这些代码行:
DEFA(myName, myAddress)
__no_init union { struct { volatile unsigned char myName_L; volatile unsigned char myName_H; }; struct { volatile unsigned short myNameL; volatile unsigned short myNameH; }; __ACCESS_20BIT_REG__ myName; } @ myAddress;
现在问你的问题: