2013-01-17 5 views
1

Je ne comprends pas pourquoi cela fonctionne:GCC extension typeof

/* gcc range extension */ 
__extension__ static int fn(int n) 
{ 
    switch (n) { 
     case 0: return 0; 
     case 1 ... 1000: return 1; 
     default: return -1; 
    } 
} 

Mais cela ne:

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

    printf("%d\n", a); 
} 

retours 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.) 

Je sais que je peux compiler avec -std=gnu99 pour éviter l'erreur, mais le premier fonctionne avec -std=c99 et utilise également une extension

Répondre

8

Les mots clés non compatibles ANSI ne sont jamais réactivés par __extension__ (le seul effet de __extension__ est la suppression d'avertissement pour -pedantic). Utilisez __typeof__ si vous souhaitez compiler en mode ANSI.

+1

wow !!!! alors '#define typeof __typeof__' évite le problème? –

+1

@David: oui, ça devrait. :) – askmish

+0

Merci à vous deux Anton et askmish;) –

2

Si vous écrivez un fichier d'en-tête qui doit fonctionner lorsqu'il est inclus dans les programmes ISO C, écrivez __typeof__ au lieu de typeof.

Référez-vous à cette link pour une description plus élaborée et les corrections possibles.

Remarque: __extension__ n'a aucun effet hormis la suppression des avertissements lors de l'utilisation du mode ANSI C -pedantic.

donc quelque chose comme ceci:

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

    printf("%d\n", a); 
} 
+0

Merci pour votre réponse et pour le lien –