_Pragma(“GCC错误”)在#if指令内外进行不同的处理

时间:2017-03-02 15:02:08

标签: gcc c-preprocessor pragma

我遇到的行为让我对_Pragma("GCC error")的预处理感到奇怪。

我使用avr-gcc(GCC)4.9.2和gcc 5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.4)获得相同的结果。

源代码:

#define E               _Pragma("GCC error \"This is an error\"")

#define _IS_VOID_       , 1

/*  Return "1" if <c> is "", return "0" otherwise.
 */
#define ISVOID(c)         _ISVOID2(c)
#define _ISVOID2(c)       _ISVOID3(_IS_VOID_##c,0,)
#define _ISVOID3(...)     _ISVOID4(__VA_ARGS__)
#define _ISVOID4(v,x,...) x


"ISVOID(something):" ISVOID(something)
"ISVOID():" ISVOID()
"ISVOID(E):" ISVOID(E)


#if ISVOID(something) == 1
"ISVOID(something)==1: true"
#else
"ISVOID(something)==1: false"
#endif

#if ISVOID() == 1
"ISVOID()==1: true"
#else
"ISVOID()==1: false"
#endif

#if ISVOID(E) == 1
"ISVOID(E)==1: true"
#else
"ISVOID(E)==1: false"
#endif

我使用gcc -E -std=c1x -Wall -Wextra -Wpedantic main.c >output处理此内容。

我在命令行上看到这个(几乎正常):

main.c:16:11: error: This is an error
 "ISVOID(E):" ISVOID(E)
           ^

并在输出中显示:

# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "main.c"
# 14 "main.c"
"ISVOID(something):" 0
"ISVOID():" 1
"ISVOID(E):"
# 16 "main.c"

# 16 "main.c"
 1





"ISVOID(something)==1: false"



"ISVOID()==1: true"







"ISVOID(E)==1: false"

然后,ISVOID(E)扩展到1指令之外的#if,它会扩展到0内部,这意味着_Pragma("GCC error")在内部和外部的处理方式不同#if指令。

此外,没有发出与#if ISVOID(E) == 1相关的“这是一个错误”。

这种行为是否正常?

1 个答案:

答案 0 :(得分:0)

GCC Bugzilla已确认这是一个错误(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=79948)。