_Pragma("GCC error") 在#if 指令内部和外部的处理方式不同
_Pragma("GCC error") is processed differently inside and outside a #if directive
我在 _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)
在 #if
指令之外扩展为 1
,并在内部扩展为 0
,这意味着 _Pragma("GCC error")
在内部和内部的处理方式不同在 #if
指令之外。
此外,与#if ISVOID(E) == 1
有关的"This is an error"没有排放。
这种行为正常吗?
GCC Bugzilla 已确认这是一个错误 (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=79948)。
我在 _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)
在 #if
指令之外扩展为 1
,并在内部扩展为 0
,这意味着 _Pragma("GCC error")
在内部和内部的处理方式不同在 #if
指令之外。
此外,与#if ISVOID(E) == 1
有关的"This is an error"没有排放。
这种行为正常吗?
GCC Bugzilla 已确认这是一个错误 (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=79948)。