4

我不明白为什么会这样:

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

4

2 回答 2

14

非 ANSI 兼容的关键字永远不会被重新启用__extension__(的唯一效果__extension__是对 的警告抑制-pedantic)。__typeof__如果要在 ANSI 模式下编译,请使用。

于 2013-01-17T12:11:05.560 回答
2

如果您正在编写包含在 ISO C 程序中时必须工作的头文件,请编写__typeof__而不是typeof.

有关更详细的描述和可能的修复,请参阅此链接。

注意: __extension__除了在使用 ANSI C-pedantic模式时抑制警告之外没有任何作用。

所以是这样的:

/* gcc typeof extension */
__extension__ static void fn(int n)
{
    __typeof__(n) a = n;

    printf("%d\n", a);
}
于 2013-01-17T12:17:01.590 回答