2017-08-16 3 views
0

avec gcc en utilisant -std=gnu99, le code suivant compile:Comment puis-je spécifier à gcc que {} init en C ne doit pas compiler?

void f() 
{ 
    struct X data = {}; 
    // do something with data 
} 

Est-ce valide C? Est-ce une extension GNU?

Comment puis-je dire à gcc de ne pas accepter ce type d'init?

Je veux assurer la compatibilité avec d'autres compilateurs (comme Visual 2015 par exemple)

+0

Qu'est-ce que vous essayez de faire avec {{} '? Initialiser le contenu de 'data'? – naccyde

+0

Oui (comme {0} qui est valide C). Le problème est que l'équipe utilise C++/C quotidiennement et il est facile pour quelqu'un de l'utiliser sans réfléchir (même si en C++, ce serait struct X data {};) – Tic

Répondre

3

Si vous souhaitez rejeter le code contenant des extensions spécifiques GNU, utilisez -std=c99 -pedantic-errors (-pedantic émettra des diagnostics pour les extensions non standard, mais il refusera pas nécessairement le code pur et simple) . Cependant, si vous voulez garantir la conformité ISO, sachez que ce n'est pas une solution à 100%. A partir de la page man gcc:

Certains utilisateurs tentent d'utiliser -pedantic pour vérifier la conformité des programmes de stricte ISO C. Ils constatent rapidement qu'il ne fait pas tout à fait ce qu'ils veulent: il trouve des pratiques non-ISO, mais pas toutes --- seulement celles pour lesquelles ISO C nécessite un diagnostic, et d'autres pour lesquelles des diagnostics ont été ajoutés.

Une fonctionnalité permettant de signaler un défaut de conformité à ISO C peut être utile dans certains cas, mais nécessiterait un travail supplémentaire considérable et serait très différente de -pedantic. Nous n'avons pas prévu de prendre en charge une telle fonctionnalité dans un proche avenir.

+0

Cela étant dit, gcc compile avec ' -std = c11 -pedantic-errors' est probablement le compilateur C le plus strictement conforme. – Lundin

3

Non, le vide est initialiseur pas standard C. Il est une extension gcc. See this pour une description détaillée.

En spécifiant -std=gnu99, vous avez autorisé l'utilisation des extensions GNU. Vous pouvez forcer le compilateur à autoriser uniquement le code conforme standard en spécifiant l'option -std=cXX.

De la gcc online manual (Souligné par)

-std=

Le compilateur peut accepter plusieurs normes de base, tels que 'C90' ou 'C++ 98' et dialectes GNU de ceux standards, tels que 'gnu90' ou 'gnu ++ 98'. Lorsqu'un standard de base est spécifié, le compilateur accepte tous les programmes suivant cette norme plus ceux qui utilisent des extensions GNU qui ne le contredisent pas. Par exemple, -std = c90 désactive certaines fonctionnalités de GCC incompatibles avec ISO C90, telles que les mots-clés asm et typeof, mais pas les autres extensions GNU qui n'ont pas de signification dans ISO C90, comme l'omission du terme moyen d'une?: expression. D'autre part, quand un dialecte GNU d'un standard est spécifié, toutes les fonctionnalités supportées par le compilateur sont activées, même lorsque ces caractéristiques changent la signification de la norme de base. Par conséquent, certains programmes conformes peuvent être rejetés. La norme particulière est utilisée par -Wedantic pour identifier les entités qui sont des extensions GNU étant donné cette version de la norme. Par exemple -std = gnu90 -Wpedantic met en garde contre les commentaires '//' de style C++, alors que -std = gnu99 -Wpedantic ne le fait pas.

3

L'option -pedantic provoquera un avertissement à afficher dans ce cas, et -Werror fera tous les avertissements à traiter comme des erreurs.

Par exemple:

x1.c: In function ‘f’: 
x1.c:11:19: error: ISO C forbids empty initializer braces [-Werror=pedantic] 
    struct X data = {};