OK, merci! C'est une manière défendable d'interpréter la norme.Citation:
Envoyé par Jean-Marc.Bourguet
Thierry
Version imprimable
OK, merci! C'est une manière défendable d'interpréter la norme.Citation:
Envoyé par Jean-Marc.Bourguet
Thierry
Et si la définition sert aussi de déclaration, comme c'est le plus souvent le cas pour main()?Citation:
Envoyé par Jean-Marc.Bourguet
Pour moi, le fait que int main() soit interprété, dans une définition de fonction, comme une fonction ne prenant aucun paramètre relève d'un soucis de compatibilité avec le code pre-ANSI. Cette syntaxe ne permet pas de la déclarer sous la forme d'un prototype. Mais comme main() n'est jamais appelé autrement que comme point d'entrée du programme... Mais je me range à l'avis de Jean-Marc Bourguet qui est bien plus expérimenté que moi.Citation:
Envoyé par stephl
Thierry
Toute definition est une declaration (eventuellement redondante)... donc s'il y a une difference entre definition et declaration elle vaut pour la definition implicite.Citation:
Envoyé par stephl
est toujours conforme.Code:
1
2
3
4 int main(); int main() { return 0; }
L'est aussi. Mais ceci ne l'est plus meme si aucune erreur n'est exigee par la norme car l'appel a main() n'a pas les bons parametres.Code:
1
2
3
4
5
6
7 int main(); void f() { main(); } int main() { ... }
Code:
1
2
3
4
5
6
7 int main(); void f() { main(); } int main(int argc, char* argv[]) { ... }
OK, merci pour ces précisions; en revanche, j'aurais plutôt écrit "toute définition est une déclaration".
Tu as raison (je corrige).Citation:
Envoyé par stephl
OK, vous me rassurez. Je croyais ne plus rien comprendre :D !Citation:
Envoyé par Jean-Marc.Bourguet
Je n'obtiens aucune erreur, mais comme tu le dis, ce n'est pas requis par la norme. Toutefois, je ne comprends pas en quoi les cas présentés sont différents du point de vue de la conformité.Citation:
Envoyé par Jean-Marc.Bourguet
Qu'en est-il de?
Dans tous les cas, la déclaration int main(); ne spécifie ni le nombre ni le type des paramètres.Code:
1
2
3
4
5
6
7
8
9
10 int main(); void f() { main(); } int main(void) { ... }
Thierry
Le cas qui n'est pas conforme appelle main sans parametres mais defini main avec des parametres.Citation:
Envoyé par mujigka
ConformeCitation:
Qu'en est-il de?
Code:
1
2
3
4
5
6
7
8
9
10 int main(); void f() { main(); } int main(void) { ... }
Et dans ce cas, il faut que l'utilisation corresponde a la definition. Plus quelques petites subtilites a cause des promotions qui ont lieu quand on n'a pas specifie le nombre et le type des parametres. Par exemple il est impossible d'appeler de maniere conforme une fonction definie int f(char c) {...} si on n'a pas de declaration ou qu'une declaration int f() parce que les char sont promus en int sauf si une declaration indiquant qu'il faut bien un char est visible.Citation:
Dans tous les cas, la déclaration int main(); ne spécifie ni le nombre ni le type des paramètres.
Il faut m'expliquer longtemps, mais je commence à comprendre. Merci pour tout!Citation:
Envoyé par Jean-Marc.Bourguet
Thierry