c - 在 C 宏中使用和返回输出

标签 c return-value c-preprocessor

我正在尝试使用一些代码来捕获和打印错误消息。目前我正在使用这样的宏:

#define my_function(x) \
  switch(function(x)) { \
    case ERROR: \
      fprintf(stderr, "Error!\n"); \
      break; \
  }

通常,我从不捕获函数输出,这工作正常。但是我发现了一些情况,其中我还需要 function() 的返回值。我尝试了类似下面的操作,但这会产生语法错误。

#define my_function(x) \
  do { \
    int __err = function(x); \
    switch(__err) { \
      case ERROR: \
        fprintf(stderr, "Error!\n"); \
        break; \
    } \
    __err; \
  } while(0)

我可以声明一个全局变量来保存函数的返回值,但这看起来很难看,而且我的程序是多线程的,所以这很可能会导致问题。我希望有更好的解决方案。

最佳答案

GCC 有一个叫做 statement expressions 的特性

所以如果像这样定义宏

#define FOO(A) ({int retval; retval = do_something(A); retval;})

然后你就可以像这样使用它了

foo = FOO(bar);

关于c - 在 C 宏中使用和返回输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3532621/

相关文章:

c - 二分查找中的返回语句

c++ - 在 C 或 C++ 中使用逗号作为宏名称

c - 在 C(或可能是 C++)中记录 X-Macros 使用模式的好引用是什么?

c - GTK3 调整大小尝试使窗口呈指数增长

C函数解释

以最有效的方式比较两个字符串数组

c++ - 如何区分预处理器和编译器指令?

c - 为什么 glibc 的 csu/init-first.c 中的 _init 在 _start 之前被调用,即使 _start 是 ELF 入口点?

c++ - 按值(value)返回总是常量吗?

java - Android Soap 服务调用的奇怪响应