在这种情况下,这个宏如何工作?

时间:2015-03-22 06:05:57

标签: c

我正在阅读一本关于linux编程的书,并且在一个用于错误处理的头文件中,他们用一个宏来停止' gcc -Wall'从抱怨控制到无效功能的结束。我不完全理解它是如何工作的。

#ifdef __GNUC__
/* macro stops 'gcc -Wall' complaining that 'control reaches
   end of non void function' if we use following functs to
   terminate main() or some other non-void funct */
#define NORETURN __attribute__ ((__noreturn__))
#else
#define NORETURN
#endif

void errExit(const char *format, ...) NORETURN;
void err_exit(const char *format, ...) NORETURN;
void errExitEN(int errnum, const char *format, ...) NORETURN;
...
#endif

我想确切知道它在做什么,以及如何做。任何帮助,将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

当您使用gcc时,

void errExit(const char *format, ...) NORETURN;

被翻译为

void errExit(const char *format, ...) __attribute__ ((__noreturn__));

由预处理器。 __noreturn__属性要做什么?

  

一些标准库函数(例如abortexit)无法返回。 GCC自动了解这一点。有些程序定义了自己永不返回的功能。你可以声明它们noreturn告诉编译器这个事实。

您在http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Function-Attributes.html了解__noreturn__以及gcc支持的其他功能属性的更多信息。

使用其他编译器时,同一行将转换为:

void errExit(const char *format, ...);