支持代码块的正确宏是什么,仍然可以容忍类型转换?
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>
答案 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();
}
否则,内联/静态函数无效。