:question:
http://pix.nofrag.com/d/c/f/f931d331...eb67fff134.png
Version imprimable
Dans la norme C89, on trouve aussi :
Citation:
A.6.5 Common extensions
The following extensions are widely used in many systems, but are not portable to all implementations. The inclusion of any extension that may cause a strictly conforming program to become invalid renders an implementation nonconforming. Examples of such extensions are new keywords, or library functions declared in standard headers or predefined macros with names that do not begin with an underscore.
A.6.5.1 Environment arguments
In a hosted environment, the main function receives a third argument, char *envp[] , that points to a null-terminated array of pointers to char , each of which points to a string that provides information about the environment for this execution of the process (2.1.2.2).
Et pour ces définitions-là
Vous savez à quel endroit la norme en parle ? Ou bien ce n'est plus supporté du tout depuis la normalisation du C ?Code:
1
2
3
4 main (void) { /* ... */ }
Le implicit int était autorisé en C90. Il n'est plus autorisé en C99.
Merci, j'ai trouvé la référence dans le draft de C89 en cherchant avec "implicit int" :
http://megaton.obfuscated.net/~orang...t.html#3.3.2.2Citation:
If the expression that precedes the parenthesized argument list in a function call consists solely of an identifier, and if no declaration is visible for this identifier, the identifier is implicitly declared exactly as if, in the innermost block containing the function call, the declaration
appeared.Code:extern int identifier();
Et une qui dit également que lorsqu'on définit une fonction sans préciser le type de retour, comme dans ton exemple avec main, alors son type de retour est int (et non void).
Je partage aussi cet avis. Le langage C semble plus permissif que C++, et le fait d'adopter une attitude rigoureuse est la meilleure solution, ne serait-ce que pour des raisons de rétro compatibilité.
Par ailleurs, la forme
contrairement àCode:int main (void)
ne vas à l'encontre d'aucune des normes du C, alors autant ne pas s'en priver.Code:int main ()
Valide peut-être pas, ou plus pour longtemps en tout cas.
voilà ce que dit C99: (je suis sûr qu'il y en a qui pensent à DBZ)
En d'autres termes si tu spécifies à ton compilateur que tu programmes selon les normes les plus récentes, tu auras certainement droit à quelques «warnings».Citation:
6.11.4 Function declarators
#1
The use of function declarators with empty parentheses (not prototype-format parameter type declarators) is an obsolescent feature.
Personne n'a dit que c'était conseillé en C99, mais ça reste valide, c'est bien ce qu'on a dit depuis le début. La quasi totalité des exemples (si ce n'est pas : tous les exemples) du document duquel tu as tiré ce 6.11.4 Function declarators ne mettent rien entre les parenthèses dans la définition de main.