无法识别的C宏

时间:2015-05-21 20:21:09

标签: c macros multiline

我遇到了一个在C头文件中定义的宏,我对理解有点麻烦。

#if BAR
  #define FOO(s,err) \
          ((SOMEPOINTER)(s))->VALID != SOMEVARIABLE \
        ? (err) \
        :
#else
  #define FOO(s,err)

就是这样。我了解if / else发生了什么,但我不确定FOO的第一个宏定义是做什么的。显然正在进行三元运算,但我对->感到好奇,因为我无法在线找到它的引用。我也很好奇这里似乎没有任何返回值。如果不管结果如何都没有返回,那么进行比较的重点是什么?说实话,那里的“\”家伙也吓坏了我。

3 个答案:

答案 0 :(得分:7)

要回答您的疑问,

  1. ->是一个结构指针解除引用运算符,用于将指针的成员变量引用到结构类型。

  2. \用于写入多行MACROS。参考C11标准,章节§6.10.3,

  3.   

    参数由可选的标识符列表指定,其范围从标识符列表中的声明扩展到终止#define预处理指令的换行符

    因此,要跨越多行的MACRO定义,您需要使用\

    1. #define MACRO不会返回任何值。它在预处理阶段被视为文本替换

答案 1 :(得分:4)

if the name 'BAR' is defined to the pre processor of the compiler
then
    define a macro 'FOO( s, err )'
    with the replacement text:
        "((SOMEPOINTER)(s))->VALID != SOMEVARIABLE ? (err) :"
        which is a ternary operator with a missing final parameter
        (so it would use what ever statement follows the macro invocation

else, when the name 'BAR' is not known to the pre processor of the compiler
then
    define the macro 'FOO( s, err )' as 'nothing
    (so what ever statement follows the macro invocation will always be executed, 
    rather than conditionally executed (as it would be above)

答案 2 :(得分:2)

要回答您关于三元的问题,它可能是错误类型的一个例子(忘记完成键入代码)或者某个人试图制作自己的(奇怪的和违反直觉的)语法。宏可以像这样使用:

FOO(someVar, doThisIfSomeVarIsBad) doThisIfSomeVarIsGood(stuff);

其中someVar是指针(指向结构的指针或指向结构的指针转换为不同的指针类型),doThisIfSomeVarIsBad是指向错误显示函数的函数指针,{ {1}}是任何陈述。

这是非常通用的(例如你的例子),但我希望你明白这一点。

这是一个有趣但仍然很奇怪的方法来进行错误处理。但是,它并不是那么糟糕,我看到更糟糕的预处理器滥用......

回答您的其他问题

doThisIfSomeVarIsGood(stuff)表示您将((SOMEPOINTER)(s))->VALID转换为指向结构的指针类型并访问其成员(s表示通过指针访问->成员 - 到结构)。

出现在换行符之前的

struct“逃脱”换行符。这是必要的,因为\ - s应该(正式)单行,所以如果你要跨行分割宏,你必须让编译器认为它仍然是一行。

是的,类似函数的宏与内联函数不同,它们不会返回任何东西。它们是简单的文本替换工具,只是用一些不同的代码替换一些代码。