• [^] # Re: Bonne nouvelle

    Posté par . En réponse à la dépêche Que penser du rachat de Novell ?. Évalué à 3.

    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.