direttiva #line (C/C++)
La direttiva #line indica al preprocessore di impostare i valori segnalati del compilatore per il numero di riga e il nome file su un determinato numero di riga e nome file.
Sintassi
#line
digit-sequence ["filename"]
Osservazioni:
Il compilatore utilizza il numero di riga e il nome del file facoltativo per fare riferimento agli errori rilevati durante la compilazione. Il numero di riga in genere si riferisce alla linea di input corrente, mentre il nome del file fa riferimento al file di input corrente. Il numero di riga viene incrementato dopo l'elaborazione di ogni riga.
Il valore della sequenza di cifre può essere qualsiasi costante integer compreso nell'intervallo compreso tra 0 e 2147483647, inclusi. La sostituzione delle macro può essere usata nei token di pre-elaborazione, ma il risultato deve restituire la sintassi corretta. Il nome file può essere qualsiasi combinazione di caratteri e deve essere racchiuso tra virgolette doppie (" "
). Se filename viene omesso, il nome file precedente rimane invariato.
È possibile modificare il numero di riga di origine e il nome file scrivendo una #line
direttiva. La #line
direttiva imposta il valore per la riga che segue immediatamente la direttiva nel file di origine. Il traduttore usa il numero di riga e il nome file per determinare i valori delle macro predefinite __FILE__
e __LINE__
. È possibile utilizzare queste macro per inserire messaggi di errore autodescrittivi nel testo del programma. Per altre informazioni su queste macro predefinite, vedere Macro predefinite.
La __FILE__
macro si espande in una stringa il cui contenuto è il nome file, racchiuso tra virgolette doppie (" "
).
Se si modifica il numero di riga e il nome del file, il compilatore ignora i valori precedenti e continua l'elaborazione con i nuovi valori. La direttiva #line viene in genere usata dai generatori di programmi. Viene usato per fare in modo che i messaggi di errore facciano riferimento al file di origine originale, anziché al programma generato.
Esempio
Gli esempi seguenti illustrano #line
e le __LINE__
macro e __FILE__
.
Nel primo esempio il numero di riga è impostato su 10, quindi su 20 e il nome file viene modificato in hello.cpp.
// line_directive.cpp
// Compile by using: cl /W4 /EHsc line_directive.cpp
#include <stdio.h>
int main()
{
printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
#line 10
printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
#line 20 "hello.cpp"
printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
printf( "This code is on line %d, in file %s\n", __LINE__, __FILE__ );
}
This code is on line 7, in file line_directive.cpp
This code is on line 10, in file line_directive.cpp
This code is on line 20, in file hello.cpp
This code is on line 21, in file hello.cpp
In questo esempio la macro ASSERT
usa le macro __LINE__
predefinite e __FILE__
per stampare un messaggio di errore sul file di origine se una determinata asserzione non è true.
#define ASSERT(cond) if( !(cond) )\
{printf( "assertion error line %d, file(%s)\n", \
__LINE__, __FILE__ );}