【问题标题】:Understanding nested macro syntax in C理解 C 中的嵌套宏语法
【发布时间】:2018-01-27 09:09:01
【问题描述】:

我正在尝试理解 C 中的宏,需要一些帮助。我对编码很陌生,感谢任何有助于理解的帮助。

  1. C 中宏定义的语法是否取决于您的编译器,或者是否有任何不特定于编译器的 C 标准定义?
  2. 宏由 C 预处理 (CPP) 执行,对吗? http://tigcc.ticalc.org/doc/cpp.html
  3. 您可以根据您设置正确的构建环境添加宏定义吗?

  4. 我试图理解这段代码,但我有点困惑。所以 第一行代码设置了一个函数宏 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


【解决方案1】:

将评论转化为答案。

  1. 宏的基本语法在所有编译器中都是标准的。

  2. 宏可以由单独的 C 预处理程序(传统上称为 cpp)解释,或者作为主编译器的一个集成部分进行解释。如今,出于各种复杂的原因,编译器通常使用集成的预处理器而不是独立的预处理器。

  3. 是的。

  4. 多个部分:

    • 哈希运算符将参数转换为字符串。
    • SEL 宏在作为参数传递的符号前面加上 s_
    • export 中的_ 只是一个“字母”; class 是 C++ 关键字,但在这里用作参数名称(预处理器运行时没有关键字)。
    • 我们不知道classMethod() 做了什么,但它得到了一系列修改过的参数。

给定:

export(Aaa, Bbb, Ccc)

您从以下位置获得输出:

classMethod(Aaa, s_Bbb, _Bbb, Ccc);

export 的宏定义中添加的分号有点可疑;通常,您会调用:

export(Aaa, Bbb, Ccc);   // Semicolon after invocation

并且在宏定义中不包含分号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多