GCC类型的扩展

时间:2013-01-17 12:06:12

标签: c gcc typeof gcc-extensions

我不明白为什么会这样:

/* 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并使用扩展程序

2 个答案:

答案 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);
}