implicite int en langage c

J’utilise orwell dev c ++ IDE. Je sais que dans l’ancienne norme C89 Standard & Pre Standard, C ++ prend en charge la règle int par défaut lorsque le type de fonction renvoyé n’est pas explicitement spécifié dans la définition de la fonction. Mais cela a été interdit en C ++. Mais récemment, j’ai écrit le programme C suivant et cela fonctionne bien.

 #include  void fun(); int main(void) { int a=9; printf("%d",a); printf("%d",a); fun(); return 0; } a=1; void fun() { printf("%d",a); } 

Est-il vrai que la règle par défaut int est également appliquée aux variables? Mon compilateur me montre les avertissements suivants.

 [Warning] data definition has no type or storage class [enabled by default] [Warning] type defaults to 'int' in declaration of 'a' [enabled by default] 

Pourquoi la norme C99 autorise-t-elle toujours les valeurs par défaut à int? Il échoue lors de la compilation en C ++. Corrigez-moi si je me trompe? Ce programme C fonctionne aussi sur des compilateurs en ligne comme ideone.com

Ceci est expliqué dans la justification du C99 :

Une nouvelle fonctionnalité de C99:

Dans C89, tous les spécificateurs de type peuvent être omis des spécificateurs de déclaration d’une déclaration. Dans un tel cas, int était impliqué. Le Comité a décidé que le danger inhérent à cette caractéristique l’emportait sur sa commodité et a donc été supprimé. L’effet est de garantir la production d’un diagnostic qui détectera une catégorie supplémentaire d’erreurs de programmation. Après avoir émis le diagnostic, une implémentation peut choisir de supposer un int implicite et de continuer à traduire le programme afin de prendre en charge le code source existant exploitant cette fonctionnalité.

En d’autres termes, il est officiellement supprimé du standard C99, mais les compilateurs peuvent toujours choisir de suivre ce comportement et d’émettre un diagnostic, comme le fait GCC. Par exemple, consultez leur page d’ options d’avertissement pour -Wimplicit-int . Pour que ces avertissements -pedantic-errors compilés en tant -pedantic-errors , utilisez -pedantic-errors ou -Werror .

Selon la réponse de @ Anonymous, c ++ 98 contient une règle similaire sur les spécificateurs de type.

7.1.5 / 2

Au moins un spécificateur de type qui n’est pas un qualificatif cv est requirejs dans une déclaration, sauf si elle déclare un constructeur, un destructeur ou une fonction de conversion. 80)

80) Il n’y a pas de disposition spéciale pour un décl-spécificateur-seq qui manque d’un spécificateur de type ou qui a un spécificateur de type qui spécifie uniquement les qualificatifs cv . La règle “implicite int” de C n’est plus prise en charge.

Par exemple, GCC prend en charge ISO / IEC 14882: 1998 et les versions ultérieures. Il s’agirait donc d’une erreur, quelle qu’elle soit.

La norme C99 n’autorise pas les types à être omis.

La section 6.7.2.2 dit:

Au moins un spécificateur de type doit figurer dans les spécificateurs de déclaration de chaque déclaration et dans la liste qualificateur-qualificateur de chaque déclaration de structure et nom de type.