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ください。

より詳細な説明と可能な修正については、このリンクを参照してください。

注: ANSI Cモード__extension__を使用する場合、警告を抑制する以外の効果はありません。-pedantic

だからこのようなもの:

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

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