do ... while(0)定义块和支持类型转换

时间:2018-05-29 08:45:33

标签: c c-preprocessor user-defined-functions

支持代码块的正确宏是什么,仍然可以容忍类型转换?

if (fooisneeded)
    (void)foo();

#define foo() do {foo_subpart1(); foo_subpart2;} while(0):不会容忍输入

#define foo() 0; do {foo_subpart1(); foo_subpart2;} while(0):将打破无括号if / <loop>

2 个答案:

答案 0 :(得分:2)

使用(void) foo()对于宏来说是不可能的,因为该构造依赖于返回类型,宏本质上没有这种类型。宏也没有关于C语义或语法的知识,因此计算返回类型是不可能的。

还有什么意义?向(void)转换函数表达式旨在告诉编译器“你不需要它”。宏甚至不返回值,它只是文本替换。你不需要“你不需要它。”

使用inline功能代替或仅使用功能。如果你需要做这种事情,那么宏是错误的工具。

答案 1 :(得分:2)

非标准地,如果它需要是一个宏,你可以使用statements-as-expression 扩展名(至少可以使用gcc,tcc和clang)

#define foo() ({ for(;;);  }) 
//equivalent to a func returning void or whatever the type of
//the last statement before }) is
int main()
{
    (void)foo();
}

否则,内联/静态函数无效。