我不明白为什么会这样:
/* gcc range extension */
__extension__ static int fn(int n)
{
switch (n) {
case 0: return 0;
case 1 ... 1000: return 1;
default: return -1;
}
}
但这不是:
/* gcc typeof extension */
__extension__ static void fn(int n)
{
typeof(n) a = n;
printf("%d\n", a);
}
gcc返回:
demo.c:14: warning: implicit declaration of function ‘typeof’
demo.c:14: warning: nested extern declaration of ‘typeof’
demo.c:14: error: expected ‘;’ before ‘a’
demo.c:16: error: ‘a’ undeclared (first use in this function)
demo.c:16: error: (Each undeclared identifier is reported only once
demo.c:16: error: for each function it appears in.)
我知道我可以使用-std=gnu99
进行编译以避免错误,但第一个可以使用-std=c99
并使用扩展程序
答案 0 :(得分:12)
__extension__
不会重新启用非ANSI兼容关键字(__extension__
的唯一影响是对-pedantic
的警告抑制)。如果要在ANSI模式下编译,请使用__typeof__
。
答案 1 :(得分:2)
如果您正在编写包含在ISO C程序中必须有效的头文件,请写__typeof__
而不是typeof
。
有关更详细的说明和可能的修复,请参阅此link。
注意:__extension__
除了在使用ANSI C -pedantic
模式时禁止警告外没有任何效果。
这样的事情:
/* gcc typeof extension */
__extension__ static void fn(int n)
{
__typeof__(n) a = n;
printf("%d\n", a);
}