了解C中的嵌套宏语法

时间:2017-08-18 16:00:25

标签: c function macros c-preprocessor

我正在尝试理解C中的宏并需要一些帮助。我对编码非常陌生,我很欣赏任何有关理解的帮助。

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

  4. 我正在尝试理解这段代码,但我有点困惑。所以     第一行代码设置了一个连接的函数宏CAT     a和b对吧?

    第二行只是创建一个函数QTE,它接受一个 名字,但我不太确定单个哈希在宏中的作用...?

    第三行我只是不确定因为我从未见过 函数与另一个函数作为其定义。是吗 连接s_和generic,然后将该值作为 输入到函数然后使用该函数作为替换 SEL(通用)?

    在第四行类中,_和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 个答案:

答案 0 :(得分:2)

将评论转换为答案。

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

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

  3. 多个部分:

    • 哈希运算符将参数转换为字符串。
    • SEL宏将作为参数传递的符号作为前缀s_
    • _中的export只是一封字母&#39 ;; class是一个C ++关键字,但在此处用作参数名称(预处理器运行时没有关键字)。
    • 我们不知道classMethod()做了什么,但会给出一系列修改后的参数。
  4. 假设:

    export(Aaa, Bbb, Ccc)
    

    你得到的输出是:

    classMethod(Aaa, s_Bbb, _Bbb, Ccc);
    

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

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

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