Recherche…


Remarques

Vue d'ensemble

Le standard C décrit la syntaxe du langage, les fonctions fournies par la bibliothèque standard et le comportement des processeurs C conformes (en gros, les compilateurs) et des programmes C conformes. En ce qui concerne le comportement, la norme spécifie pour la plupart des comportements particuliers pour les programmes et les processeurs. D'un autre côté, certaines opérations ont un comportement non défini, explicite ou implicite - de telles opérations doivent toujours être évitées, car vous ne pouvez pas vous fier à elles. Entre les deux, il y a une variété de comportements définis par l'implémentation . Ces comportements peuvent varier entre les processeurs C, les runtimes et les bibliothèques standard (collectivement, les implémentations ), mais ils sont cohérents et fiables pour toute implémentation donnée, et les implémentations conformes documentent leur comportement dans chacun de ces domaines.

Il est parfois raisonnable qu'un programme repose sur un comportement défini par l'implémentation. Par exemple, si le programme est de toute façon spécifique à un environnement d'exploitation particulier, il est peu probable que le recours à des comportements définis par l'implémentation pour les processeurs communs pour cet environnement pose problème. Alternativement, on peut utiliser des directives de compilation conditionnelle pour sélectionner les comportements définis par l'implémentation appropriés pour l'implémentation utilisée. Dans tous les cas, il est essentiel de savoir quelles opérations ont un comportement défini pour la mise en œuvre, de manière à les éviter ou à prendre une décision éclairée quant à savoir si et comment les utiliser.

Le reste de ces remarques constitue une liste de tous les comportements et caractéristiques définis dans la norme C2011, avec des références à la norme. Beaucoup d'entre eux utilisent la terminologie de la norme . Certains autres s'appuient plus généralement sur le contexte de la norme, comme les huit étapes de la traduction du code source dans un programme, ou la différence entre les implémentations hébergées et autonomes. Certains, particulièrement surprenants ou remarquables, sont présentés en caractères gras. Tous les comportements décrits ne sont pas pris en charge par les normes C antérieures, mais ils ont généralement un comportement défini par la mise en œuvre dans toutes les versions de la norme qui les prennent en charge.

Programmes et processeurs

Général

  • Le nombre de bits dans un octet ( 3.6 / 3 ). Au moins 8 , la valeur réelle peut être interrogée avec la macro CHAR_BIT .

  • Quels messages de sortie sont considérés comme des "messages de diagnostic" ( 3.10 / 1 )

Traduction source

  • La manière dont les caractères multi-octets du fichier source physique sont associés au jeu de caractères source ( 5.1.1.2/1 ).

  • Si les séquences non vides d'espaces blancs non newline sont remplacées par des espaces simples pendant la phase de traduction 3 ( 5.1.1.2/1 )

  • Les caractères de l'ensemble d'exécution auxquels les caractères littéraux et les caractères des constantes de chaîne sont convertis (pendant la phase de traduction 5) lorsqu'il n'y a pas d'autre caractère correspondant ( 5.1.1.2/1 ).

Environnement d'exploitation

  • La manière dont les messages de diagnostic à émettre sont identifiés ( 5.1.1.3/1 ).

  • Le nom et le type de la fonction appelée au démarrage dans une implémentation autonome ( 5.1.2.1/1 ).

  • Quelles bibliothèques sont disponibles dans une implémentation autonome, au-delà d’un ensemble minimal spécifié ( 5.1.2.1/1 ).

  • L'effet de la fin du programme dans un environnement autonome ( 5.1.2.1/2 ).

  • Dans un environnement hébergé, toute signature autorisée pour la fonction main() autre que int main(int argc, char *arg[]) et int main(void) ( 5.1.2.2.1 / 1 ).

  • La manière dont une implémentation hébergée définit les chaînes pointées par le second argument de main() ( 5.1.2.2.1 / 2 ).

  • Ce qui constitue un "dispositif interactif" aux fins des sections 5.1.2.3 (Exécution du programme) et 7.21.3 (Fichiers) ( 5.1.2.3/7 ).

  • Toute restriction sur les objets auxquels les routines d'interruption de traitement font référence dans une implémentation optimisée ( 5.1.2.3/10 ).

  • Dans une implémentation autonome, si plusieurs threads d'exécution sont pris en charge ( 5.1.2.4/1 ).

  • Les valeurs des membres du jeu de caractères d'exécution ( 5.2.1 / 1 ).

  • Les char valeurs correspondant aux séquences d'échappement alphabétiques définies ( 5.2.2 / 3 ).

  • Les limites et caractéristiques numériques entières et à virgule flottante ( 5.2.4.2/1 ).

  • La précision des opérations arithmétiques à virgule flottante et des conversions de la bibliothèque standard à partir de représentations internes en virgule flottante en représentations de chaînes ( 5.2.4.2.2 / 6 ).

  • La valeur de la macro FLT_ROUNDS , qui code le mode d'arrondi à virgule flottante par défaut ( 5.2.4.2.2 / 8 ).

  • Les comportements d'arrondi caractérisés par des valeurs de FLT_ROUNDS supérieures à 3 ou inférieures à -1 ( 5.2.4.2.2 / 8 ).

  • La valeur de la macro FLT_EVAL_METHOD , qui caractérise le comportement d'évaluation en virgule flottante ( 5.2.4.2.2 / 9 ).

  • Comportement caractérisé par des valeurs de FLT_EVAL_METHOD inférieures à -1 ( 5.2.4.2.2 / 9 ).

  • Les valeurs des macros FLT_HAS_SUBNORM , DBL_HAS_SUBNORM et LDBL_HAS_SUBNORM , caractérisant si les formats à virgule flottante standard prennent en charge les nombres inférieurs à la normale ( 5.2.4.2.2 / 10 )

Les types

  • Le résultat de la tentative d'accès (indirectement) à un objet avec une durée de stockage de thread à partir d'un thread autre que celui avec lequel l'objet est associé ( 6.2.4 / 4 )

  • La valeur d'une char dans laquelle un caractère à l'extérieur de l'ensemble d'exécution de base a été affectée ( 6.2.5 / 3 ).

  • Les types entiers signés étendus pris en charge, le cas échéant ( 6.2.5 / 4 ), et tous les mots clés d'extension utilisés pour les identifier.

  • Si char a la même représentation et le même comportement que le caractère signed char ou le caractère unsigned char ( 6.2.5 / 15 ). Peut être interrogé avec CHAR_MIN , qui est soit 0 ou SCHAR_MIN si char est non signé ou signé, respectivement.

  • Le nombre, l'ordre et le codage des octets dans les représentations des objets , sauf si explicitement spécifié par la norme ( 6.2.6.1/2 ).

  • Laquelle des trois formes de représentation entière reconnues s'applique dans une situation donnée, et si certains modèles de bits des objets entiers sont des représentations de pièges ( 6.2.6.2/2 ).

  • L'exigence d'alignement de chaque type ( 6.2.8 / 1 ).

  • Si et dans quels contextes, tous les alignements étendus sont pris en charge ( 6.2.8 / 3 ).

  • L'ensemble des alignements étendus pris en charge ( 6.2.8 / 4 ).

  • Les nombres de conversion entiers de tous les types entiers signés étendus les uns par rapport aux autres ( 6.3.1.1/1 ).

  • L'affectation d'une valeur hors plage à un entier signé ( 6.3.1.3/3 ).

  • Lorsqu'une valeur à portée mais non représentable est attribuée à un objet à virgule flottante, comment la valeur représentable stockée dans l'objet est choisie parmi les deux valeurs représentables les plus proches ( 6.3.1.4/2 ; 6.3.1.5/1 ; 6.4.4.2 / 3 ).

  • Le résultat de la conversion d'un entier en un type de pointeur , à l'exception des expressions constantes entières avec la valeur 0 ( 6.3.2.3/5 ).

Formulaire source

  • Les emplacements dans les directives #pragma où les jetons de nom d'en-tête sont reconnus ( 6.4 / 4 ).

  • Les caractères, y compris les caractères multi-octets autres que le soulignement, les lettres latines non accentuées, les noms de caractères universels et les chiffres décimaux pouvant apparaître dans les identificateurs ( 6.4.2.1/1 ).

  • Le nombre de caractères significatifs dans un identifiant ( 6.4.2.1/5 ).

  • À quelques exceptions près, la manière dont les caractères source d'une constante de caractère entier sont mappés sur des caractères d'ensemble d'exécution ( 6.4.4.4/2 ; 6.4.4.4/10 ).

  • Paramètres régionaux courants utilisés pour calculer la valeur d'une constante de caractère large et la plupart des autres aspects de la conversion de nombreuses constantes de ce type ( 6.4.4.4/11 ).

  • Si les jetons littéraux à chaînes larges préfixés différemment peuvent être concaténés et, si tel est le cas, le traitement de la séquence de caractères multi-octets résultante ( 6.4.5 / 5 )

  • Les paramètres régionaux utilisés lors de la phase de traduction 7 pour convertir les chaînes de caractères larges en séquences de caractères multi-octets, et leur valeur lorsque le résultat n'est pas représentable dans le jeu de caractères d'exécution ( 6.4.5 / 6 ).

  • La manière dont les noms d'en-tête sont mappés aux noms de fichiers ( 6.4.7 / 2 ).

Évaluation

  • FP_CONTRACT si et comment les expressions à virgule flottante sont contractées lorsque FP_CONTRACT n'est pas utilisé ( 6.5 / 8 ).

  • Les valeurs des résultats des opérateurs sizeof et _Alignof ( 6.5.3.4/5 ).

  • La taille du type de résultat de la soustraction de pointeur ( 6.5.6 / 9 ).

  • Le résultat du décalage à droite d'un entier signé avec une valeur négative ( 6.5.7 / 5 ).

Comportement d'exécution

  • La mesure dans laquelle le mot-clé de register est effectif ( 6.7.1 / 6 ).

  • Si le type d'un champ de bits déclaré comme int est le même que unsigned int ou signed int ( 6.7.2 / 5 ).

  • Quels types de champs de bits peuvent prendre, autres que _Bool , facultativement qualifiés, _Bool signed int et unsigned int ; si les champs de bits peuvent avoir des types atomiques ( 6.7.2.1/5 ).

  • Aspects de la manière dont les implémentations organisent le stockage pour les champs de bits ( 6.7.2.1/11 ).

  • L'alignement des membres non bitfield des structures et des unions ( 6.7.2.1/14 ).

  • Le type sous-jacent pour chaque type énuméré ( 6.7.2.2/4 ).

  • Ce qui constitue un "accès" à un objet de type volatile qualifié ( 6.7.3 / 7 ).

  • L'efficacité des déclarations de fonctions en inline ( 6.7.4 / 6 ).

Préprocesseur

  • Si les constantes de caractères sont converties en valeurs entières de la même manière dans les conditions préprocesseurs que dans les expressions ordinaires, et si une constante à un seul caractère peut avoir une valeur négative ( 6.10.1 / 4 ).

  • Les emplacements ont recherché les fichiers désignés dans une directive #include ( 6.10.2 / 2-3 ).

  • La manière dont un nom d'en-tête est formé à partir des jetons d'une directive #include multi-token ( 6.10.2 / 4 ).

  • La limite pour l'imbrication #include ( 6.10.2 / 6 ).

  • Si un caractère \ est inséré avant le \ introduction d'un nom de caractère universel dans le résultat de l'opérateur # du préprocesseur ( 6.10.3.2/2 ).

  • Le comportement de la directive de prétraitement #pragma pour les pragmas autres que STDC ( 6.10.6 / 1 ).

  • La valeur des macros __DATE__ et __TIME__ si aucune date ou heure de traduction, respectivement, n'est disponible ( 6.10.8.1/1 ).

  • Le codage de caractères interne utilisé pour wchar_t si la macro __STDC_ISO_10646__ n'est pas définie ( 6.10.8.2/1 ).

  • Le codage de caractères interne utilisé pour char32_t si la macro __STDC_UTF_32__ n'est pas défini ( 6.10.8.2/1 ).

Bibliothèque standard

Général

  • Le format des messages émis lorsque les assertions échouent ( 7.2.1.1/2 ).

Fonctions d'environnement à virgule flottante

  • Toutes les exceptions à virgule flottante supplémentaires au-delà de celles définies par la norme ( 7.6 / 6 ).

  • Tous les modes d'arrondi à virgule flottante supplémentaires au-delà de ceux définis par la norme ( 7.6 / 8 ).

  • Tout environnement à virgule flottante supplémentaire au-delà de ceux définis par la norme ( 7.6 / 10 ).

  • La valeur par défaut du commutateur d'accès à l'environnement à virgule flottante ( 7.6.1 / 2 ).

  • La représentation des indicateurs d'état à virgule flottante enregistrés par fegetexceptflag() ( 7.6.2.2/1 ).

  • feraiseexcept() si la fonction feraiseexcept() déclenche en plus une exception à virgule flottante "inexacte" à chaque fois qu'elle génère une exception à virgule flottante "overflow" ou " underflow" ( 7.6.2.3/2 ).

Fonctions liées aux paramètres régionaux

  • Les chaînes de paramètres régionaux autres que "C" supportées par setlocale() ( 7.11.1.1/3 ).

Fonctions mathématiques

  • Les types représentés par float_t et double_t lorsque la macro FLT_EVAL_METHOD a une valeur différente de 0 , 1 et 2 ( 7.12 / 2 ).

  • Toute classification à virgule flottante prise en charge au-delà de celles définies par la norme ( 7.12 / 6 ).

  • La valeur renvoyée par le math.h fonctionne en cas d'erreur de domaine ( 7.12.1 / 2 ).

  • La valeur renvoyée par le math.h fonctionne en cas d'erreur de pôle ( 7.12.1 / 3 ).

  • La valeur renvoyée par le math.h fonctionne lorsque le résultat est sous-jacent, et indique si errno est défini sur ERANGE et si une exception à virgule flottante est déclenchée dans ces circonstances ( 7.12.1 / 6 ).

  • La valeur par défaut du commutateur de contraction FP ( 7.12.2 / 2 ).

  • Si les fonctions fmod() renvoient 0 ou fmod() une erreur de domaine lorsque leur second argument est 0 ( 7.12.10.1/3 ).

  • Si les fonctions remainder() renvoient 0 ou génèrent une erreur de domaine lorsque leur second argument est 0 ( 7.12.10.2/3 ).

  • Nombre de bits significatifs dans les modules quotient calculés par les fonctions remquo() ( 7.12.10.3/2 ).

  • Si les fonctions remquo() renvoient 0 ou remquo() une erreur de domaine lorsque leur second argument est 0 ( 7.12.10.3/3 ).

Les signaux

  • L'ensemble complet des signaux pris en charge, leur sémantique et leur traitement par défaut ( 7.14 / 4 ).

  • Lorsqu'un signal est déclenché et qu'un gestionnaire personnalisé est associé à ce signal, quels signaux, le cas échéant, sont bloqués pendant la durée de l'exécution du gestionnaire ( 7.14.1.1/3 ).

  • Les signaux autres que SIGFPE , SIGILL et SIGSEGV provoquent un comportement indéfini lors du retour d'un gestionnaire de signal personnalisé ( 7.14.1.1/3 ).

  • Quels signaux sont initialement configurés pour être ignorés (indépendamment de leur traitement par défaut; 7.14.1.1/6 ).

Divers

  • La constante de pointeur null spécifique à laquelle la macro NULL développe ( 7.19 / 3 ).

Fonctions de traitement de fichiers

  • Si la dernière ligne d'un flux de texte nécessite une nouvelle ligne de terminaison ( 7.21.2 / 2 ).

  • Nombre de caractères nuls ajoutés automatiquement à un flux binaire ( 7.21.2 / 3 ).

  • La position initiale d'un fichier ouvert en mode annexe ( 7.21.3 / 1 ).

  • Si une écriture sur un flux de texte provoque la troncature du flux ( 7.21.3 / 2 ).

  • Prise en charge de la mise en mémoire tampon des flux ( 7.21.3 / 3 ).

  • Indique si des fichiers de longueur nulle existent ( 7.21.3 / 4 ).

  • Les règles pour composer des noms de fichiers valides ( 7.21.3 / 8 ).

  • Si le même fichier peut être simultanément ouvert plusieurs fois ( 7.21.3 / 8 ).

  • La nature et le choix de l'encodage pour les caractères multi-octets ( 7.21.3 / 10 ).

  • Comportement de la fonction remove() lorsque le fichier cible est ouvert ( 7.21.4.1/2 ).

  • Comportement de la fonction rename() lorsque le fichier cible existe déjà ( 7.21.4.2/2 ).

  • Si les fichiers créés via la fonction tmpfile() sont supprimés dans le cas où le programme se termine anormalement ( 7.21.4.3/2 ).

  • Quel mode change sous quelles circonstances sont autorisées via freopen() ( 7.21.5.4/3 ).

Fonctions d'E / S

  • Laquelle des représentations autorisées des valeurs infinies et non-nombre de FP est produite par les fonctions printf () - family ( 7.21.6.1/8 ).

  • La manière dont les pointeurs sont formatés par la fonction printf() ( 7.21.6.1/8 ).

  • Le comportement de la famille scanf() fonctionne lorsque le caractère - apparaît dans une position interne de la liste de scrutation d'un [ champ ( 7.21.6.2/12 )).

  • La plupart des aspects de la transmission des fonctions p de la famille scanf() ( 7.21.6.2/12 ).

  • La valeur d' errno définie par fgetpos() en cas d'échec ( 7.21.9.1/2 ).

  • La valeur d' errno définie par fsetpos() en cas d'échec ( 7.21.9.3/2 ).

  • La valeur d' errno définie par ftell() en cas d'échec ( 7.21.9.4/3 ).

  • La signification des fonctions de famille strtod() de certains aspects pris en charge d'un formatage NaN ( 7.22.1.3p4 ).

  • strtod() si les strtod() la famille strtod() placent errno sur ERANGE lorsque le résultat est sous-développé ( 7.22.1.3/10 ).

Fonctions d'allocation de mémoire

  • Le comportement des attributions de mémoire fonctionne lorsque le nombre d'octets requis est 0 ( 7.22.3 / 1 ).

Fonctions d'environnement système

  • Quels nettoyages sont effectués, le cas échéant, et quel statut est renvoyé au système d'exploitation hôte lorsque la fonction abort() est appelée ( 7.22.4.1/2 ).

  • Quel statut est renvoyé à l'environnement hôte lorsque exit() est appelé ( 7.22.4.4/5 ).

  • La gestion des flux ouverts et quel statut est renvoyé à l'environnement hôte lorsque _Exit() est appelé ( 7.22.4.5/2 ).

  • L'ensemble des noms d'environnement accessibles via getenv() et la méthode de modification de l'environnement ( 7.22.4.6/2 ).

  • La valeur de retour de la fonction system() ( 7.22.4.8/3 ).

Fonctions de date et heure

  • Le fuseau horaire local et l'heure d'été ( 7.27.1 / 1 ).

  • La plage et la précision des temps représentables via les types clock_t et time_t ( 7.27.1 / 4 ).

  • Le début de l'ère qui sert de référence pour les temps renvoyés par la fonction clock() ( 7.27.2.1/3 ).

  • Le début de l'époque qui sert de référence pour les temps renvoyés par la fonction timespec_get() (lorsque la base de temps est TIME_UTC ; 7.27.2.5/3 ).

  • Le remplacement strftime() du spécificateur de conversion %Z dans les paramètres régionaux "C" ( 7.27.3.5/7 ).

Fonctions d'E / S à caractères larges

  • Laquelle des représentations autorisées des valeurs infinies et non-nombre de FP est produite par les wprintf() la famille wprintf() ( 7.29.2.1/8 ).

  • La manière dont les pointeurs sont formatés par les wprintf() la famille wprintf() ( 7.29.2.1/8 ).

  • Le comportement de la famille wscanf() fonctionne lorsque le caractère - apparaît dans une position interne de la liste de scrutation d'un [ champ ( 7.29.2.2/12 )).

  • La plupart des aspects des wscanf() fonctions -family de la remise des p champs ( 7.29.2.2/12 ).

  • La signification des fonctions de la famille wstrtod() de certains aspects du formatage NaN pris en charge ( 7.29.4.1.1 / 4 ).

  • wstrtod() si les wstrtod() la famille wstrtod() placent errno à ERANGE lorsque le résultat est sous- jacent ( 7.29.4.1.1 / 10 ).

Décalage à droite d'un entier négatif

int signed_integer = -1;

// The right shift operation exhibits implementation-defined behavior:
int result = signed_integer >> 1;

Affectation d'une valeur hors plage à un entier

// Supposing SCHAR_MAX, the maximum value that can be represented by a signed char, is
// 127, the behavior of this assignment is implementation-defined:
signed char integer;
integer = 128;

Allouer zéro octet

// The allocation functions have implementation-defined behavior when the requested size
// of the allocation is zero.
void *p = malloc(0);

Représentation d'entiers signés

Chaque type entier signé peut être représenté dans l'un des trois formats; c'est l'implémentation qui est utilisée. L'implémentation utilisée pour tout type entier signé au moins aussi large que int peut être déterminée à l'exécution à partir des deux bits de poids faible de la représentation de la valeur -1 dans ce type, comme ceci:

enum { sign_magnitude = 1, ones_compl = 2, twos_compl = 3, };
#define SIGN_REP(T) ((T)-1 & (T)3)

switch (SIGN_REP(long)) {
   case sign_magnitude: { /* do something */ break; }
   case ones_compl:     { /* do otherwise */ break; }
   case twos_compl:     { /* do yet else  */ break; }
   case 0:  { _Static_assert(SIGN_REP(long), "bogus sign representation"); }
}

Le même modèle s'applique à la représentation des types plus étroits, mais ils ne peuvent pas être testés par cette technique car les opérandes de & sont soumis aux "conversions arithmétiques habituelles" avant que le résultat ne soit calculé.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow