Standards spécifiques à l'implémentation ANSI
Remonter à Guide du langage C++ - Index
Certains aspects du standard ANSI C ne sont pas définis exactement par ANSI. A la place, chaque implémenteur d'un compilateur C est libre de définir ces aspects individuellement. Cette rubrique décrit comment Embarcadero a choisi de définir ces standards spécifiques à l'implémentation. Les numéros de section se réfèrent au standard C ANSI/ISO de février 1990. Sachez qu'il existe des différences entre C et C++ ; cette rubrique ne concerne que C.
2.1.1.3 Comment identifier un diagnostic
Quand le compilateur s'exécute avec la combinaison d'options correcte, tous les messages émis commençant par le mot Fatal, Error ou Warning sont des diagnostics au sens d'ANSI. Voici les options nécessaires pour garantir cette interprétation :
Option | Action |
---|---|
–A |
Activer seulement les mots clés ANSI. |
–C– |
Les commentaires imbriqués ne sont pas autorisés. |
–i32 |
Au plus 32 caractères significatifs dans les identificateurs. |
–p– |
Utiliser les conventions d'appel du C. |
–w– |
Désactiver tous les avertissements. |
–wbei |
Activer l'avertissement relatif aux initialiseurs inappropriés. |
–wbig |
Activer l'avertissement relatif aux constantes trop grandes. |
–wcpt |
Activer l'avertissement relatif aux comparaisons de pointeurs non portables. |
–wdcl |
Activer l'avertissement relatif aux déclarations sans type ou classe de stockage. |
–wdup |
Activer l'avertissement relatif aux définitions de macros non identiques dupliquées. |
–wext |
Activer l'avertissement relatif aux variables déclarées à la fois comme externe et comme statique. |
–wfdt |
Activer l'avertissement relatif aux définitions de fonctions utilisant un typedef. |
–wrpt |
Activer l'avertissement relatif à la conversion de pointeurs non portables. |
–wstu |
Activer l'avertissement relatif aux structures non définies. |
–wsus |
Activer l'avertissement relatif à la conversion de pointeurs suspects. |
–wucp |
Activer l'avertissement relatif au mélange de pointeurs sur caractères signés et non signés. |
–wvrt |
Activer l'avertissement relatif aux fonctions void renvoyant une valeur. |
D'autres options non spécifiquement mentionnées ici peuvent être définies à la valeur de votre choix.
2.1.2.2.1 La sémantique des arguments à main
Quand le programme s'exécute sur DOS, argv[0] pointe sur le nom du programme. Les chaînes argv restantes pointent sur chaque composant des arguments de la ligne de commande DOS. Les espaces séparant les arguments sont retirés, et chaque séquence de caractères non espace contigus est traitée comme un argument unique. Les chaînes délimitées sont gérées correctement (c'est-à-dire comme une chaîne contenant des espaces).
2.1.2.3 Que constitue un périphérique interactif
Un périphérique interactif est un périphérique qui ressemble à la console.
2.2.1 La séquence de classement du jeu de caractères d'exécution
La séquence de classement du jeu de caractères d'exécution utilise la valeur du caractère en ASCII.
2.2.1 Membres des jeux de caractères d'exécution et de source
Les jeux de caractères d'exécution et de source représentent le jeu ASCII étendu supporté par l'IBM PC. Tout caractère autre que Ctrl+Z peut apparaître dans les littéraux chaîne, les constantes caractère ou les commentaires.
2.2.1.2 Caractères multi-octets
Les caractères multi-octets sont pris en charge dans C++Builder.
2.2.2 La direction de l'impression
L'impression s'effectue de la gauche vers la droite, la direction normale pour le PC.
2.2.4.2 Le nombre de bits d'un caractère du jeu de caractères d'exécution
Il y a 8 bits par caractère dans le jeu de caractères d'exécution.
3.1.2 Le nombre de caractères initiaux significatifs dans les identificateurs
Les 32 premiers caractères sont significatifs, mais vous pouvez utiliser une option de ligne de commande (–i) pour changer ce nombre. Les identificateurs internes et externes utilisent le même nombre de caractères significatifs. Le nombre de caractères significatifs dans les identificateurs C++ est illimité.
3.1.2 Définir si les distinctions de casse sont significatives dans les identificateurs externes
Le compilateur force normalement le lieur à distinguer les minuscules des majuscules. Vous pouvez utiliser une option de ligne de commande (–lc–) pour désactiver la sensibilité à la casse.
3.1.2.5 Les représentations et ensembles de valeurs des divers types d'entiers
Type | Valeur minimale | Valeur maximale |
---|---|---|
signed char |
–128 |
127 |
unsigned char |
0 |
255 |
signed short |
–32 768 |
32 767 |
unsigned short |
0 |
65 535 |
signed int |
–2 147 483 648 |
2 147 483 647 |
unsigned int |
0 |
4 294 967 295 |
signed long |
–2 147 483 648 |
2 147 483 647 |
unsigned long |
0 |
4 294 967 295 |
Tous les types char utilisent un octet de 8 bits pour le stockage.
Tous les types short utilisent 2 octets.
Tous les types int utilisent 4 octets.
Tous les types long utilisent 4 octets.
Si l'alignement est requis (–a), tous les objets de type non char seront alignés sur des limites d'octets paires. Si l'alignement requis est –a4, le résultat est un alignement sur 4 octets. Les types de caractères ne sont jamais alignés.
3.1.2.5 Les représentations et ensembles de valeurs des divers types de nombres à virgule flottante
Les formats à virgule flottante IEEE tels qu'utilisés par Intel 8086 sont utilisés pour tous les types à virgule flottante C++Builder. Le type float utilise le format réel IEEE 32 bits. Le type double utilise le format réel IEEE 64 bits. Le type long double utilise le format réel étendu IEEE 80 bits.
3.1.3.4 Le mappage entre les jeux de caractères d'exécution et de source
Tous les caractères des littéraux chaîne ou des constantes caractère restent inchangés lors de l'exécution du programme. Les jeux de caractères d'exécution et de source sont les mêmes.
3.1.3.4 La valeur d'une constante caractère entière qui contient une séquence de caractères ou d'échappement non représentée dans le jeu de caractères d'exécution de base ou le jeu de caractères étendu pour une constante caractère étendu
Les caractères étendus sont pris en charge.
3.1.3.4 Les paramètres régionaux en cours utilisés pour convertir des caractères multi-octets en caractères étendus correspondants pour une constante caractère étendu
Les constantes caractère étendu sont reconnus.
3.1.3.4 La valeur d'une constante entière contenant plus d'un caractère, ou une constante caractère étendu contenant plus d'un caractère multi-octet
Les constantes caractère peuvent contenir un ou deux caractères. Si deux caractères sont inclus, le premier caractère occupe l'octet de poids faible de la constante, et le deuxième caractère occupe l'octet de poids fort.
3.2.1.2 Le résultat de la conversion d'un entier en un entier signé plus court, ou le résultat de la conversion d'un entier non signé en un entier signé de même longueur, si la valeur ne peut pas être représentée
Ces conversions sont effectuées en tronquant simplement les bits de poids fort. Les entiers signés sont stockés sous la forme de valeurs en complément à deux, le nombre résultant est ainsi interprété comme tel. Si le bit de poids fort de l'entier le plus petit est différent de zéro, la valeur est interprétée comme une valeur négative ; sinon, elle est positive.
3.2.1.3 La direction de la troncature quand un nombre intégral est converti en un nombre à virgule flottante qui ne peut pas représenter exactement la valeur originale
La valeur entière est arrondie à la valeur représentable la plus proche. Ainsi, par exemple, la valeur long (2^31 –1) est convertie en la valeur float 2^31. Les liens sont rompus selon les règles de l'arithmétique standard IEEE.
3.2.1.4 La direction de la troncature ou de l'arrondi quand un nombre à virgule flottante est converti en un nombre à virgule flottante rétréci
La valeur est arrondie à la valeur représentable la plus proche. Les liens sont rompus selon les règles de l'arithmétique standard IEEE.
3.3 Les résultats des opérations binaires sur des entiers signés
Les opérateurs binaires (bit à bit) s'appliquent aux entiers signés comme s'ils étaient leurs types non signés correspondants. Le bit de signe est traité comme un bit de donnée normal. Le résultat est alors interprété comme un entier signé en complément à deux normal.
3.3.2.3 Que se passe t-il quand un membre d'un objet d'union est accédé en utilisant un membre d'un type différent
L'accès est autorisé et le membre de type différent accédera aux bits stockés là. Vous devrez bien comprendre les encodages de bits des valeurs à virgule flottante pour comprendre comment accéder à un membre de type flottant en utilisant un membre différent. Si le membre stocké est plus court que le membre utilisé pour accéder à la valeur, les bits en excès ont la valeur qu'ils avaient avant le stockage du membre court.
3.3.3.4 Le type d'entier requis pour contenir la taille maximale d'un tableau
Pour un tableau normal, le type est unsigned int, et pour les tableaux à très grande capacité, le type est signed long.
3.3.4 Le résultat de la conversion d'un pointeur en un entier, ou vice-versa
Lors de la conversion entre entiers et pointeurs de même taille, aucun bit n'est modifié. Lors de la conversion d'un type en un type plus court, les bits de poids fort sont tronqués. Lors de la conversion d'un type entier en un type pointeur plus long, l'entier est d'abord élargi en un type entier de même taille que le type pointeur. Ainsi, les entiers signés seront étendus par le signe pour remplir les nouveaux octets. De même, les types pointeur convertis en types entier plus grands seront d'abord agrandis en type pointeur aussi large que le type entier.
3.3.5 Le signe du reste d'une division d'entiers
Le signe du reste est négatif quand un seul des opérandes est négatif. Si aucun opérande n'est négatif ou si les deux opérandes sont négatifs, le reste est positif.
3.3.6 Le type d'entier requis pour contenir la différence entre deux pointeurs sur des éléments du même tableau, ptrdiff_t
Le type est signed int.
3.3.7 Le résultat d'un décalage vers la droite d'un type intégral signé négatif
Une valeur signée négative est étendue par le signe lors d'un décalage vers la droite.
3.5.1 L'extension vers laquelle les objets peuvent réellement être placés dans les registres en utilisant le spécificateur de classe de stockage register
Les objets déclarés avec des types pointeur ou entier à un, deux ou quatre octets peuvent être placés dans les registres. Au moins deux, et jusqu'à sept registres sont disponibles. Le nombre de registres réellement utilisés dépend des registres nécessaires pour les valeurs temporaires de la fonction.
3.5.2.1 Définir si un champ de bits plain int est traité comme un champ de bits signed int ou unsigned int
Les champs de bits plain int sont traités comme des champs de bits signed int.
3.5.2.1 L'ordre d'allocation des champs de bits au sein d'un int
Les champs de bits sont alloués de la position de bit de poids faible vers celle de poids fort.
3.5.2.1 Le remplissage et l'alignement des membres de structures
Par défaut, aucun remplissage n'est utilisé dans les structures. Si vous utilisez l'option d'alignement de mot (–a), les structures sont complétées sur une taille paire, et tous les membres qui n'ont pas de type caractère ou tableau de caractères sont alignés sur un décalage multiple paire.
3.5.2.1 Définir si un champ de bits peut chevaucher une limite d'unité de stockage
Selon l'alignement global et l'alignement de type, un champ de bits est autorisé à chevaucher une unité de stockage.
3.5.2.2 Le type entier choisi pour représenter les valeurs d'un type énumération
Stocke tous les énumérateurs comme des entiers pleins. Stocke les énumérations dans un long ou un unsigned long si les valeurs ne tiennent pas dans un int. C'est le comportement par défaut comme spécifié par l'option de compilation –b. Le comportement –b- spécifie que les énumérations doivent être stockées dans le type entier le plus petit qui peut représenter les valeurs. Cela inclut tous les types intégrals, par exemple, signed char, unsigned char, signed short, unsigned short, signed int, unsigned int, signed long et unsigned long.
Pour la compatibilité C++, –b- doit être spécifié car le stockage de toutes les énumérations sous forme d'entiers n'est pas correct pour C++.
3.5.3 Que représente un accès à un objet ayant un type qualifié volatile
Toute référence à un objet volatile accédera à l'objet. Le fait qu'un accès aux emplacements mémoire adjacents accèdera aussi à un objet dépend de la façon dont la mémoire est construite dans le matériel. Pour une mémoire de périphérique spéciale, telle que la mémoire d'affichage vidéo, cela dépend de la façon dont le périphérique est construit. Pour la mémoire PC normale, les objets volatiles sont utilisés seulement pour la mémoire accessible par des interruptions asynchrones. Ainsi, l'accès aux objets adjacents n'a pas d'effet.
3.5.4 Le nombre maximal de déclarateurs qui peuvent modifier un type union, structure ou arithmétique
Il n'y a pas de limite spécifique sur le nombre de déclarateurs. Le nombre de déclarateurs autorisé est assez large, mais quand ils sont imbriqués en profondeur au sein des blocs d'une fonction, le nombre de déclarateurs sera réduit. Le nombre autorisé au niveau fichier est d'au moins 50.
3.6.4.2 Le nombre maximal de valeurs case dans une instruction switch
Il n'y a pas de limite spécifique sur le nombre de cases dans une instruction switch. Tant qu'il y a assez de mémoire pour contenir les informations case, le compilateur les acceptera.
3.8.1 Définir si la valeur d'une constante caractère à caractère unique dans une expression de constante qui contrôle l'inclusion conditionnelle correspond à la valeur de la même constante caractère dans le jeu de caractères d'exécution. Définir si une telle constante caractère peut avoir une valeur négative
Toutes les constantes caractère, même les constantes des directives conditionnelles, utilisent le même jeu de caractères (exécution). Les constantes caractère à caractère unique seront négatives si le type caractère est signé (valeur par défaut et –K non requis).
3.8.2 La méthode de localisation des fichiers source incluables
Pour les noms de fichiers include entre crochets angulaires, si des répertoires include sont donnés dans la ligne de commande, le fichier est alors recherché dans chacun des répertoires include. La recherche dans les répertoires include s'effectue dans l'ordre suivant :
- Dans les répertoires spécifiés sur la ligne de commande
- Dans les répertoires spécifiés dans le fichier de configuration de l'interface de ligne de commande du compilateur. Par exemple, dans
BCC32.CFG
pour BCC32.EXE. - Si aucun répertoire include n'est spécifié, la recherche s'effectue seulement dans le répertoire en cours.
3.8.2 La prise en charge des noms entre guillemets pour les fichiers source incluables
Pour les noms de fichiers incluables entre guillemets, le fichier est recherché dans l'ordre suivant :
- Dans le même répertoire que le fichier contenant l'instruction #include.
- Dans les répertoires des fichiers qui incluent (#include) ce fichier.
- Dans le répertoire en cours.
- Dans le chemin spécifié par l'option de compilation /I.
- Dans les chemins spécifiés par la variable d'environnement INCLUDE.
3.8.2 Le mappage des séquences de caractères des noms de fichiers source
Les barres obliques inverses des noms de fichiers include sont traités en tant que caractères distincts, et non comme des caractères d'échappement. Les différences de casse sont ignorées pour les lettres.
3.8.8 Les définitions pour _ _DATE_ _ et _ _TIME_ _ quand elles sont disponibles
La date et l'heure sont toujours disponibles et utiliseront la date et l'heure du système d'exploitation.
4.1.1 Le caractère symbole décimal
Le caractère symbole décimal est une virgule.
4.1.5 Le type de l'opérateur sizeof, size_t
Le type size_t est non signé.
4.1.5 La constante pointeur null sur laquelle la macro NULL est développée
NULL est développé en un zéro int ou un zéro long. Les deux sont des nombres signés 32 bits.
4.2 Le diagnostic imprimé par, et le comportement de terminaison de la fonction assert
Le message de diagnostic imprimé est "Echec de l'assertion : expression, file nomfichier, line nn", où expression est l'expression d'assertion qui a échoué, nomfichier est le nom du fichier source, et nn est le numéro de ligne où l'assertion a pris place.
Abort est appelée immédiatement après l'affichage du message d'assertion.
4.3 Les aspects définis par l'implémentation, des fonctions de test de caractères et de mappage de casse
Aucun, autre que ce qui est mentionné en 4.3.1.
4.3.1 Les jeux de caractères testés par les fonctions isalnum, isalpha, iscntrl, islower, isprint et isupper
Les 128 premiers caractères ASCII pour les paramètres régionaux C par défaut. Sinon, tous les 256 caractères.
4.5.1 Les valeurs renvoyées par les fonctions mathématiques sur les erreurs de domaine
Un NAN (Not A Number) IEEE.
4.5.1 Définir si les fonctions mathématiques définissent l'expression entière errno à la valeur de la macro ERANGE sur les erreurs d'étendue de débordement négatif
Non, seulement pour les autres erreurs — domaine, singularité, débordement positif et perte totale de précision.
4.5.6.4 Définir si une erreur de domaine se produit ou si zéro est renvoyé quand la fonction fmod a un deuxième argument de zéro
Non ; fmod(x,0) renvoie 0.
4.7.1.1 L'ensemble de signaux pour la fonction signal
SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV et SIGTERM.
4.7.1.1 La sémantique pour chaque signal reconnu par la fonction signal
Voir la description de signal (C RTL).
4.7.1.1 La gestion par défaut et la gestion au démarrage du programme pour chaque signal reconnu par la fonction signal
Voir la description de signal (C RTL).
4.7.1.1 Si l'équivalent de signal(sig, SIG_DFL); n'est pas exécuté avant l'appel d'un gestionnaire de signal, le blocage du signal qui est effectué
L'équivalent de signal (C RTL)(sig, SIG_DFL) est toujours exécuté.
4.7.1.1 Définir si la gestion par défaut est réinitialisée si le signal SIGILL est reçu par un gestionnaire spécifié à la fonction signal
Non, elle ne l'est pas.
4.9.2 Définir si la dernière ligne d'un flux de texte nécessite un caractère nouvelle ligne de terminaison
Non, aucun n'est nécessaire.
4.9.2 Définir si les caractères espace qui sont écrits dans un flux de texte immédiatement avant un caractère nouvelle ligne apparaissent lors de la lecture
Oui, ils apparaissent.
4.9.2 Le nombre des caractères null qui peuvent être ajoutés aux données écrites dans un flux binaire
Aucun.
4.9.3 Définir si l'indicateur de position de fichier d'un flux en mode ajout est initialement placé au début ou à la fin du fichier
L'indicateur de position de fichier d'un flux en mode ajout est initialement placé au début du fichier. Il est réinitialisé à la fin du fichier avant chaque écriture.
4.9.3 Définir si une écriture sur un flux de texte provoque la troncature du fichier associé au-delà de ce point
Une écriture de 0 octet peut ou ne pas tronquer le fichier, selon la façon dont le fichier est mis en mémoire tampon. Il est plus sûr de classifier une écriture de longueur zéro comme ayant un comportement indéterminé.
4.9.3 Les caractéristiques de la mise en mémoire tampon des fichiers
Les fichiers peuvent être mis en mémoire tampon entièrement, par ligne ou pas du tout. Si un fichier est mis en mémoire tampon, un tampon par défaut de 512 octets est créé à l'ouverture du fichier.
4.9.3 Définir si un fichier de longueur zéro existe réellement
Oui, il existe réellement.
4.9.3 Définir si le même fichier peut être ouvert plusieurs fois
Oui, il le peut.
4.9.4.1 L'effet de la fonction remove sur un fichier ouvert
Aucune vérification spéciale n'est effectuée pour un fichier déjà ouvert ; la responsabilité est laissée au programmeur.
4.9.4.2 L'effet si un fichier existe avec le nouveau nom avant un appel à la fonction rename
Rename renvoie –1 et errno est définie sur EEXIST.
4.9.6.1 La sortie de la conversion %p dans fprintf
La sortie est de huit chiffres hexadécimaux (XXXXXXXX), pas de complément, les lettres en majuscules (identique à %08lX).
4.9.6.2 La sortie de la conversion %p dans fscanf
Voir 4.9.6.1.
4.9.6.2 L'interprétation d'un caractère – (tiret) qui n'est ni le premier ni le dernier caractère de la liste d'analyse d'une conversion %[ dans fscanf
Voir la description de scanf.
4.9.9.1 La valeur de la macro errno est définie par la fonction fgetpos ou ftell à l'échec
EBADF Numéro de fichier incorrect.
4.9.10.4 Les messages générés par perror
Liste d'arguments trop grande |
Tentative de retrait du répertoire en cours |
Adresse incorrecte | ||
Numéro de fichier incorrect |
Périphérique de traitement par blocs requis |
Canal endommagé | ||
Liaison inter-périphérique |
Erreur 0 |
Erreur de format d'exécution | ||
Fichier exécutable en cours d'utilisation |
Le fichier existe déjà |
Fichier trop volumineux | ||
Recherche non autorisée |
Opération de contrôle d'E/S inappropriée |
Erreur d'entrée/sortie | ||
Appel de fonction interrompu |
Code d'accès non valide |
Argument non valide | ||
Données non valides |
Environnement non valide |
Format non valide | ||
Numéro de fonction non valide |
Adresse du bloc mémoire non valide |
Est un répertoire | ||
Argument mathématique |
Zone mémoire corrompue |
Nom trop long | ||
Aucun processus enfant |
Plus de fichiers |
Espace insuffisant sur le périphérique | ||
Aucun périphérique correspondant |
Aucun périphérique ou adresse correspondant |
Aucun fichier ou répertoire correspondant | ||
Aucun processus correspondant |
N'est pas un répertoire |
Mémoire insuffisante | ||
Périphérique différent |
Opération interdite |
Chemin introuvable | ||
Permission refusée |
Blocage possible |
Système de fichiers en lecture seule | ||
Ressource occupée |
Ressource temporairement indisponible |
Résultat trop grand | ||
Trop de liens |
Trop de fichiers ouverts |
4.10.3 Le comportement de calloc, malloc ou realloc, si la taille requise est zéro
calloc et malloc ignorent la requête et renvoient 0. realloc libère le bloc.
4.10.4.1 Le comportement de la fonction abort par rapport aux fichiers temporaires ouverts
Les mémoires tampon des fichiers ne sont pas vidés et les fichiers ne sont pas fermés.
4.10.4.3 Le statut renvoyé par exit si la valeur de l'argument est différent de zéro, EXIT_SUCCESS ou EXIT_FAILURE
Rien de spécial. Le statut est renvoyé tel qu'il a été passé. Le statut est représenté par un signed char.
4.10.4.4 L'ensemble des noms d'environnement et la méthode de modification de la liste d'environnement utilisés par getenv
Les chaînes d'environnement sont celles définies dans le système d'exploitation par la commande SET. putenv peut être utilisée pour modifier les chaînes pendant la durée de vie du programme en cours, mais la commande SET doit être utilisée pour modifier une chaîne d'environnement de façon permanente.
4.10.4.5 Le contenu et le mode d'exécution de la chaîne par la fonction système
La chaîne est interprétée en tant que commande du système d'exploitation. COMSPEC ou CMD.EXE est utilisé, et la chaîne de l'argument est passée en tant que commande à exécuter. Toute commande intégrée du système d'exploitation, ainsi que les fichiers de traitement par lots et les fichiers exécutables, peuvent être exécutés.
4.11.6.2 Le contenu des chaînes des messages d'erreur renvoyés par strerror
Voir 4.9.10.4.
4.12.1 Le fuseau horaire local et l'heure d'été
Définis par la date et l'heure locales du PC.
4.12.2.1 La zone de l'horloge
Représentée sous la forme de graduations d'horloge, avec pour origine le début du programme d'exécution.