Standards spécifiques à l'implémentation ANSI

De RAD Studio
Aller à : navigation, rechercher

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 :

  1. Dans les répertoires spécifiés sur la ligne de commande
  2. 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.
  3. 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 :

  1. Dans le même répertoire que le fichier contenant l'instruction #include.
  2. Dans les répertoires des fichiers qui incluent (#include) ce fichier.
  3. Dans le répertoire en cours.
  4. Dans le chemin spécifié par l'option de compilation /I.
  5. 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.