【发布时间】:2018-01-27 09:09:01
【问题描述】:
我正在尝试理解 C 中的宏,需要一些帮助。我对编码很陌生,感谢任何有助于理解的帮助。
- C 中宏定义的语法是否取决于您的编译器,或者是否有任何不特定于编译器的 C 标准定义?
- 宏由 C 预处理 (CPP) 执行,对吗? http://tigcc.ticalc.org/doc/cpp.html
您可以根据您设置正确的构建环境添加宏定义吗?
-
我试图理解这段代码,但我有点困惑。所以 第一行代码设置了一个函数宏 CAT 连接 a和b对吗?
第二行只是创建了一个函数 QTE,它接受一个 名称,但我不太确定单个哈希在宏中的作用...?
第三行我只是不确定,因为我从未见过 函数以另一个函数作为其定义。是吗 连接 s_ 和 generic 然后将该值作为 输入到函数,然后使用该函数代替 塞尔(通用)?
在第四行类中,_和type没有定义,但是它 将替换包含在 第四行代码的三个函数正确吗?
#define CAT(a,b) a##b #define QTE(name) #name #define SEL(generic) CAT(s_,generic) #define export(class, generic, type) classMethod(class, SEL(generic), CAT(_, generic), type) ;
【问题讨论】:
-
这就是通常所说的“预处理器魔法”。冒着听起来愤世嫉俗的风险,我建议尝试在不了解细节的情况下相处。否则我建议做一些广泛的玩耍和试验。作为它变得多么邪恶的一个例子:这里扩展宏的级别数(如果您愿意,可以嵌套深度)是相关的。尝试使用编译器的功能来仅预处理并查看结果,以了解具体的魔术示例。
-
(1) 基本语法在所有编译器中都是标准的。 (2) 宏可以由单独的 CPP 程序解释,或作为主编译器的一个集成部分。如今,由于各种复杂的原因,集成比独立更常见。 (3) 是的。 (4) 哈希运算符将参数转换为字符串。 SEL 在作为参数传递的符号前面加上
s_。_只是一个“字母”;class是 C++ 关键字;我们不知道classMethod()做了什么。 -
宏只是做文本替换,所以在预处理函数名之后会变成 s_something。
标签: c function macros c-preprocessor