Bien, tu as juste prouvé que ceux qui ne suivent pas la norme ANSI ont des problème de portabilité.
Je crois qu’il y a un problème de définition : coder en ANSI veut dire respecter la norme et ne pas faire de suppositions sur les comportements indéfinis de la norme.
Taille des int ⇒ tout un tas de constante à chercher dans un include (dont j’ai oublié le nom), dans le cas où on sait que ce sera problématique.
/ d’entiers négatifs ⇒ Répètes après moi : « La division d’entiers en C est une division euclidienne. » Un fois que tu as compris ça tu n’as plus jamais de problème avec les divisions d’entiers, quelque soit le langage. C’est tout simplement magique...1
Taille des pointeurs ⇒ sizeof est ton ami.
Va donc sur l’article anglais, la phrase est assez éloquente :
« The reason some behavior has been left undefined is to allow compilers for a wide variety of instruction set architectures to generate more efficient executable code for well-defined behavior, which was deemed important for C's primary role as a systems implementation language; thus C makes it the programmer's responsibility to avoid undefined behavior, possibly using tools to find parts of a program whose behavior is undefined. Examples of undefined behavior are:
* accessing outside the bounds of an array
* overflowing a signed integer
* reaching the end of a non-void function without finding a return statement, when the return value is used
* reading the value of a variable before initializing it »
Les comportement indéfinis sont précisément là pour laisser champ libre à l’implémentation en fonction de l’architecture cible. Et pour enfoncer le clou :
« These operations are all programming errors that could occur using many programming languages; C draws criticism because its standard explicitly identifies numerous cases of undefined behavior, including some where the behavior could have been made well defined, and does not specify any run-time error handling mechanism. » C’est-il pas beau ?
Pour la route : « man gcc », [/], « -ansi », « -pedantic », et surtout retourner sur les bancs de l’école. On ne peut pas dire que je pisse du C à longueur de journée, mais je connais quand même les bases.
Et, je crois que ça vient de C99, s’il y a quelqu’un pour confirmer..., on a accès à des types à la taille prédéfinie.
1 D’une part, la division euclidienne n’est bien définie que pour les entiers naturels (c.-à-d. positifs), d’autre part, la blague avec l’arrondi à l’entier inférieur n’en est plus une.
[^] # Re: Bonne nouvelle
Posté par nicolas . En réponse à la dépêche Que penser du rachat de Novell ?. Évalué à 3.
Je crois qu’il y a un problème de définition : coder en ANSI veut dire respecter la norme et ne pas faire de suppositions sur les comportements indéfinis de la norme.
Taille des int ⇒ tout un tas de constante à chercher dans un include (dont j’ai oublié le nom), dans le cas où on sait que ce sera problématique.
/ d’entiers négatifs ⇒ Répètes après moi : « La division d’entiers en C est une division euclidienne. » Un fois que tu as compris ça tu n’as plus jamais de problème avec les divisions d’entiers, quelque soit le langage. C’est tout simplement magique...1
Taille des pointeurs ⇒ sizeof est ton ami.
Va donc sur l’article anglais, la phrase est assez éloquente :
« The reason some behavior has been left undefined is to allow compilers for a wide variety of instruction set architectures to generate more efficient executable code for well-defined behavior, which was deemed important for C's primary role as a systems implementation language; thus C makes it the programmer's responsibility to avoid undefined behavior, possibly using tools to find parts of a program whose behavior is undefined. Examples of undefined behavior are:
* accessing outside the bounds of an array
* overflowing a signed integer
* reaching the end of a non-void function without finding a return statement, when the return value is used
* reading the value of a variable before initializing it »
Les comportement indéfinis sont précisément là pour laisser champ libre à l’implémentation en fonction de l’architecture cible. Et pour enfoncer le clou :
« These operations are all programming errors that could occur using many programming languages; C draws criticism because its standard explicitly identifies numerous cases of undefined behavior, including some where the behavior could have been made well defined, and does not specify any run-time error handling mechanism. » C’est-il pas beau ?
Pour la route : « man gcc », [/], « -ansi », « -pedantic », et surtout retourner sur les bancs de l’école. On ne peut pas dire que je pisse du C à longueur de journée, mais je connais quand même les bases.
Et, je crois que ça vient de C99, s’il y a quelqu’un pour confirmer..., on a accès à des types à la taille prédéfinie.
1 D’une part, la division euclidienne n’est bien définie que pour les entiers naturels (c.-à-d. positifs), d’autre part, la blague avec l’arrondi à l’entier inférieur n’en est plus une.