Question

Je suis habitué à de style ancien et C et ont tout récemment commencé à explorer les caractéristiques du C99. Je viens juste une question: Est-ce que mon programme compilé avec succès si j'utilise C99 dans mon programme, le drapeau c99 avec gcc et le lien avec les bibliothèques antérieures C99

?

Alors, dois-je tenir à l'ancienne C89 ou évoluer?

Était-ce utile?

La solution

Je crois qu'ils sont compatibles à cet égard. C'est aussi longtemps que les choses que vous compilez contre ne pas marcher sur l'un des nouveaux goodies. Par exemple, si l'ancien code contient enum bool { false, true }; alors vous êtes en difficulté. Comme un dinosaure similaire, j'embrassais lentement le nouveau monde merveilleux de C99. Après tout, il a seulement été tapi là-bas depuis environ 10 ans maintenant;)

Autres conseils

Vous devez évoluer. Merci pour votre écoute: -)

En fait, je vais développer sur ce point.

Vous avez raison C99 a été autour depuis un certain temps. Vous devrait (à mon avis) utilisera cette norme pour autre chose que le code existant (où vous venez de corriger les bugs plutôt que d'ajouter de nouvelles fonctionnalités). Il est sans doute pas la peine pour le code existant, mais vous devez (comme toutes les décisions d'affaires) faire votre propre analyse coûts / avantages.

Je suis déjà mon nouveau code veiller à c'est compatible avec C1x - alors que je ne suis pas en utilisant l'une des nouvelles fonctionnalités encore, j'essaie de vous assurer qu'il ne se cassera pas

.

Quant à ce code pour chercher, les auteurs des normes prennent rétrocompatibilité très au sérieux. Leur travail était jamais de concevoir une nouvelle langue, il était de codifier les pratiques existantes.

La phase ils sont en ce moment leur permet une plus grande latitude dans la mise à jour de la langue, mais ils suivent toujours le serment d'Hippocrate en termes de leur production. « Tout d'abord, ne pas nuire »

En général, si votre code est rompu avec une nouvelle norme, le compilateur est obligé de vous dire. Donc, simplement la compilation de votre base de code sera un excellent départ. Cependant, si vous lisez le document de justification C99 , vous verrez l'expression « changement tranquille » semble -. c'est ce que vous devez regarder pour

Ce sont des changements de comportement dans le compilateur que vous n'avez pas besoin d'être informé et peut-être la source d'une grande angoisse existentielle et des grincements de dents si votre application commence à agir étrange. Ne vous inquiétez pas au sujet du « changement calme dans C89 » bits -. Si elles étaient un problerm, vous auriez déjà été mordu par les

Ce document, par ailleurs, est une excellente lecture pour comprendre pourquoi la norme réelle dit ce qu'il dit.

Respectueusement. Essayez et trouver :-)

Bien, gardez à l'esprit que même si vous devez corriger quelques différences compilation minior, déplaçant est sans doute la peine.

Si vous ne respectez pas les caractéristiques explicites C99, un code C90 fonctionnera bien drapeau C99 avec un autre avant les bibliothèques C99.

Mais il y a des dos bibliothèques à base de C89 comme ,, qui va certainement pas travailler.

C99 est beaucoup plus souple pour se sentir libre de migrer: -)

Les conventions d'appel entre les bibliothèques C n'a pas changé depuis des siècles, et en fait, je ne suis pas sûr qu'il ait jamais fait.

Systèmes d'exploitation à ce point comptent beaucoup sur les conventions d'appel C puisque les API C ont tendance à être la colle entre les morceaux de l'OS.

Donc, en gros, la réponse est « Oui, les binaires seront rétrocompatibles. Non, naturellement, code à l'aide des fonctionnalités C99 ne peut ensuite être compilé avec un compilateur non-C99. »

Il est destiné à être rétrocompatible. Il formalise les extensions que de nombreux fournisseurs ont déjà mis en œuvre. Il est possible, peut-être même probable, qu'un programme bien écrit ne pas avoir des problèmes lors de la compilation avec C99.

Dans mon expérience, recompiler certains modules et pas d'autres pour gagner du temps ... gaspille beaucoup de temps. En général, il y a un détail qui a besoin facilement négligé le nouveau compilateur pour le rendre compatible avec tous.

Il y a quelques parties de la norme C89 qui sont écrits de façon ambiguë, et selon la façon dont on interprète la règle sur les types de pointeurs et les objets qu'ils accèdent, la norme peut être considérée comme décrivant une des deux langues très différentes --one dont est sémantiquement beaucoup plus puissant et par conséquent utilisable dans un large éventail de domaines, et l'un qui permet plus de possibilités d'optimisation à base de compilateur. La norme C99 « clarifié » la règle à préciser qu'il ne fait aucun effort pour la compatibilité avec le mandat l'ancienne langue, même si elle a été plébiscité dans de nombreux domaines; il traite aussi undefined certaines choses qui ont été définies dans C89, mais seulement parce que les règles C89 ne sont pas écrites avec suffisamment de précision pour les interdire (par exemple l'utilisation de memcpy pour le type calembour dans les cas où la destination a une durée de tas).

C99 peut donc être compatible avec la langue que ses auteurs ont pensé a été décrit par C89, mais il est pas compatible avec la langue qui a été traitée par la plupart des compilateurs C89 dans les années 1990.

Certaines fonctionnalités C89 ne sont pas valides C99

On peut dire que, ces caractéristiques existent seulement pour des raisons historiques, et ne doit pas être utilisé dans le code C89 moderne, mais ils existent.

Le C99 N1256 projet de norme paragraphe 5 compare l'avant-propos C99 à des révisions plus anciennes, et est un bon endroit pour commencer la recherche de ces incompatibilités, même si elle est de loin plus que des extensions restrictions.

retour Implicit int et types de variables

Mentionné par Lutz dans un commentaire, par exemple les éléments suivants sont valables C89:

static i;
f() { return 1; }

mais pas C99, dans lequel vous devez écrire:

static int i;
int f() { return 1; }

Cela empêche également d'appeler des fonctions sans prototypes en C99: sont des prototypes nécessaires pour toutes les fonctions C89, C90 ou C99?

n1256 dit:

  

int supprimer implicite

Retour sans expression pour fonction non vide

valide C89, C99 invalide:

int f() { return; }

Je pense que dans C89 retourne une valeur définie de mise en œuvre. n1256 dit:

  

retour sans expression non autorisé dans la fonction qui retourne une valeur

Division entière avec opérande négatif

  • C89: tours à une direction définie de mise en œuvre
  • C99: tours à 0

Donc, si votre compilateur arrondi à -inf, vous vous êtes fié que le comportement défini de mise en œuvre, votre compilateur est maintenant obligé de casser votre code sur C99.

https://stackoverflow.com/a/3604984/895245

n1256 dit:

  

division entière fiable

Compatibilité avec Windows

Une préoccupation majeure pratique est d'être capable de compiler sous Windows, puisque Microsoft ne pas l'intention de mettre en œuvre pleinement C99 trop tôt .

Ceci est par exemple pourquoi libgit2 limites autorisées dispose C99 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top