Mic*_*ior 13 c return-value c-preprocessor
我正在尝试检测一些代码来捕获和打印错误消息.目前我正在使用像这样的宏:
#define my_function(x) \
switch(function(x)) { \
case ERROR: \
fprintf(stderr, "Error!\n"); \
break; \
}
Run Code Online (Sandbox Code Playgroud)
通常,我从不捕获函数输出,这很好.但我发现了几个我需要返回值的情况function().我试过类似下面的内容,但这会产生语法错误.
#define my_function(x) \
do { \
int __err = function(x); \
switch(__err) { \
case ERROR: \
fprintf(stderr, "Error!\n"); \
break; \
} \
__err; \
} while(0)
Run Code Online (Sandbox Code Playgroud)
我可以声明一个全局变量来保存函数的返回值,但这看起来很难看,我的程序是多线程的,所以这可能会导致问题.我希望那里有更好的解决方案.
qrd*_*rdl 56
GCC有一个称为语句表达式的功能
所以如果定义宏像
#define FOO(A) ({int retval; retval = do_something(A); retval;})
Run Code Online (Sandbox Code Playgroud)
你可以使用像
foo = FOO(bar);
Run Code Online (Sandbox Code Playgroud)
Jen*_*edt 10
这是相对复杂的代码,没有太多理由在宏中使用它.如果您真的想将它放在头文件中,请将它inline(C99)或static(C89)或两者都设置.使用任何合理的编译器,这应该导致与宏相同的效率.
小智 5
一个很晚的答复。但是仍然如此。我同意内联函数更好,但MACRO确实提供了一些内联函数无法获得的漂亮打印乐趣。我同意@qrdl的观点,如果您稍微重组一下语句,则确实可以使用语句表达式。这是它与宏一起工作的方式-
#define my_function(x, y) ({ \
int __err = 0; \
do { \
__err = function(x, y); \
switch(__err) { \
case ERROR: \
fprintf(stderr, "Error!\n"); \
break; \
} \
} while(0); \
__err; \
})
Run Code Online (Sandbox Code Playgroud)