Pour avoir un prototype complet, il faut préciser les paramètres. Dans le cas où une fonction ne prend pas de paramètre, il faut la déclarer ainsi:
type_retour nom_fonction(void)
Si on la définit de la manière que tu as faite
type_retour nom_fonction()
alors on retombe sur les "anciennes" déclarations (au sens C), et aucun contrôle n'est fait par le compilateur sur les paramètres envoyés: voir la phrase 6.7.5.3.p14 du n1124:
The empty list in a function declarator that is not part of a
definition of that function specifies that no information about the number or types of the parameters is supplied.
comparée avec 6.7.5.3.p10:
The special case of an unnamed parameter of type void as the only item in the listspecifies that the function has no parameters.
tu as le droit d'appeler ensuite les fonctions avec des paramètres quelquonques, ce qui diminue l'utilité du protoype...
- - - - - - -
main()
{
Les deux seules manières portables de définir main sont int main(void)et int main(int argc, char **argv) (ou des définitions compatibles, comme char *argv[]). Le reste est dépendant de la plate-forme.
- - - - - - -
char car;
do
{
<snip>
/* ignore tous les caracteres non alphanumeriques */
while(!isalnum(car=getchar()));
Non. getchar() renvoie un int. Sa valeur de retour exacte est:
- soit le prochain caractère en unsigned char;
- soit EOF si le flux est "fini".
cf. 7.19.7.1p2
If the end-of-file indicator for the input stream pointed to by stream is not set and a next character is present, the fgetc function obtains that character as an unsigned char converted to an int
7.19.7.1 p3:
If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the endof-
file indicator for the stream is set and the fgetc function returns EOF.
et 7.19.1p3
EOF
which expands to an integer constant expression, with type int and a negative
Donc, envoyer le résultat de getchar (qui est un équivalent de getc(stdin), lui-même (quasi) équivalent à fgetc(stdin)) dans un char peut causer une perte d'information si ton implémentation définit le char comme signé.
En pratique, EOF peut valoir par exemple -1, qui correspond parfois à la valeur signed char du caractère ÿ, si je me souviens bien. Ce qui signifie que, si tu lis ce ÿ avec ton code (ou d'autres caractères suivant l'environnement), sa valeur unsigned déborde la capacité du signed char, et retombe sur -1 par les règles de conversions entières. Tu croiras voir un EOF, donc isalnum() renvoie faux, et le while le bouffera sans broncher... Dans ton cas, ce n'est pas forcément grave, mais l'erreur peut porter à conséquence dans d'autres contextes.
# En passant...
Posté par alf . En réponse au message shm_open() référence indifinie !!!. Évalué à 3.
Si on la définit de la manière que tu as faite
alors on retombe sur les "anciennes" déclarations (au sens C), et aucun contrôle n'est fait par le compilateur sur les paramètres envoyés: voir la phrase 6.7.5.3.p14 du n1124:
comparée avec 6.7.5.3.p10:
Donc avec tes protoypes tu as le droit d'appeler ensuite les fonctions avec des paramètres quelquonques, ce qui diminue l'utilité du protoype...
- - - - - - -
Les deux seules manières portables de définir main sont int main(void)et int main(int argc, char **argv) (ou des définitions compatibles, comme char *argv[]). Le reste est dépendant de la plate-forme.
- - - - - - -
Non. getchar() renvoie un int. Sa valeur de retour exacte est:
- soit le prochain caractère en unsigned char;
- soit EOF si le flux est "fini".
cf. 7.19.7.1p2
7.19.7.1 p3:
et 7.19.1p3
Donc, envoyer le résultat de getchar (qui est un équivalent de getc(stdin), lui-même (quasi) équivalent à fgetc(stdin)) dans un char peut causer une perte d'information si ton implémentation définit le char comme signé.
En pratique, EOF peut valoir par exemple -1, qui correspond parfois à la valeur signed char du caractère ÿ, si je me souviens bien. Ce qui signifie que, si tu lis ce ÿ avec ton code (ou d'autres caractères suivant l'environnement), sa valeur unsigned déborde la capacité du signed char, et retombe sur -1 par les règles de conversions entières. Tu croiras voir un EOF, donc isalnum() renvoie faux, et le while le bouffera sans broncher... Dans ton cas, ce n'est pas forcément grave, mais l'erreur peut porter à conséquence dans d'autres contextes.