【发布时间】:2019-12-23 16:39:07
【问题描述】:
是否可以使用 Open Watcom C 编译器(不是 C++)创建 #define NORETURN(x) 宏?
基于the fine manual我有这个文件test.c:
#include <stdlib.h>
#ifdef __GNUC__
#define STATIC_NORETURN(sig) static void sig __attribute__((__noreturn__))
#define EXTERN_NORETURN(sig) extern void sig __attribute__((__noreturn__))
#endif
#ifdef __WATCOMC__
#pragma aux noreturn aborts;
#define STATIC_NORETURN(sig) static void __pragma("noreturn") sig
#define EXTERN_NORETURN(sig) extern void __pragma("noreturn") sig
#endif
STATIC_NORETURN(my_static_example(void));
EXTERN_NORETURN(my_extern_example(void));
static void my_static_example(void) {
exit(0);
}
void my_extern_example(void) {
my_static_example();
}
它使用 GCC 编译没有任何错误或警告:
$ gcc -Wall -Wextra -pedantic -std=gnu99 -c test.c
但不使用 Open Watcom 1.9:
$ wine wcc386 -q -wx test.c
test.c(14): Error! E1009: Expecting ')' but found 'noreturn'
test.c(14): Error! E1026: Invalid declarator
test.c(14): Error! E1009: Expecting ',' but found 'noreturn'
test.c(14): Error! E1026: Invalid declarator
test.c(14): Error! E1009: Expecting ',' but found ')'
test.c(14): Error! E1024: Declared symbol 'my_static_example' is not in parameter list
test.c(15): Error! E1023: Storage class of parameter must be register or unspecified
test.c(15): Error! E1009: Expecting ')' but found 'noreturn'
test.c(15): Error! E1024: Declared symbol '__pragma' is not in parameter list
test.c(15): Error! E1009: Expecting ',' but found 'noreturn'
test.c(15): Error! E1026: Invalid declarator
test.c(15): Error! E1009: Expecting ',' but found ')'
test.c(15): Error! E1024: Declared symbol 'my_extern_example' is not in parameter list
test.c(17): Error! E1023: Storage class of parameter must be register or unspecified
test.c(17): Error! E1024: Declared symbol 'my_static_example' is not in parameter list
test.c(17): Error! E1076: Missing semicolon at end of declaration
test.c(22): Warning! W131: No prototype found for function 'my_static_example'
test.c(14): Warning! W202: Symbol '__pragma' has been defined, but not referenced
仔细阅读后,我认为手册说__pragma 出于某种原因仅适用于 C++ 代码。但我不确定我是否理解正确。 C 是否有任何等效项不需要在每个函数定义的位置使用#pragma?我试图避免使用 ifdef,所以最好在一个中心位置定义一个可移植的 NORETURN 宏。
【问题讨论】:
-
请发minimal reproducible example 帮助解释为什么不能使用这样的预处理器宏。
标签: c c-preprocessor watcom noreturn