Namespaces
Variants

Filename and line information

From cppreference.net

Modifie le numéro de ligne actuel et le nom du fichier dans le préprocesseur.

Table des matières

Syntaxe

#line lineno (1)
#line lineno " filename " (2)

Explication

1) Modifie le numéro de ligne actuel du préprocesseur en lineno . Les occurrences de la macro __LINE__ au-delà de ce point se développeront en lineno plus le nombre de lignes de code source réelles rencontrées depuis.
2) Modifie également le nom du fichier de préprocesseur actuel en filename . Les occurrences de la macro __FILE__ au-delà de ce point produiront filename .

Tous les jetons de prétraitement (constantes de macro ou expressions) sont autorisés comme arguments à #line tant qu'ils se développent en un entier décimal valide suivi optionnellement d'une chaîne de caractères valide.

lineno doit être une séquence d'au moins un chiffre décimal (le programme est mal formé sinon) et est toujours interprété comme décimal (même s'il commence par 0 ).

Si lineno est 0 ou supérieur à 32767 (jusqu'à C99) 2147483647 (depuis C99) , le comportement est indéfini.

Notes

Cette directive est utilisée par certains outils de génération automatique de code qui produisent des fichiers source C à partir d'un fichier écrit dans un autre langage. Dans ce cas, #line des directives peuvent être insérées dans le fichier C généré référençant les numéros de ligne et le nom du fichier source original (modifiable par l'humain).

Le numéro de ligne suivant la directive #line __LINE__ n'est pas spécifié (il y a deux valeurs possibles que __LINE__ peut développer dans ce cas : le nombre de fins de ligne vues jusqu'à présent, ou le nombre de fins de ligne vues jusqu'à présent plus la fin de ligne qui termine la #line directive). Ceci est le résultat du DR 464 , qui s'applique rétroactivement.

Exemple

#include <assert.h>
#define FNAME "test.c"
int main(void)
{
#line 777 FNAME
        assert(2+2 == 5);
}

Sortie possible :

test: test.c:777: int main(): Assertion `2+2 == 5' failed.

Références

  • Norme C17 (ISO/CEI 9899:2018) :
  • 6.10.4 Contrôle de ligne (p: 126)
  • J.1 Comportement non spécifié
  • Norme C11 (ISO/CEI 9899:2011) :
  • 6.10.4 Contrôle de ligne (p: 173)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 6.10.4 Contrôle de ligne (p: 158)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 3.8.4 Contrôle de ligne

Voir aussi

Documentation C++ pour Informations sur le nom de fichier et la ligne