Diretiva #line (C/C++)
A diretiva #line instrui o pré-processador a definir os valores relatados do compilador para o número da linha e o nome do arquivo para um determinado número de linha e nome do arquivo.
Sintaxe
#line
seqüência de dígitos ["nome do arquivo"]
Comentários
O compilador usa o número de linha e o nome de arquivo opcional para fazer referência aos erros que encontra durante a compilação. O número de linha geralmente se refere à linha de entrada atual, e o nome de arquivo se refere ao arquivo de entrada atual. O número de linha é incrementado depois que cada linha é processada.
O valor da sequência de dígitos pode ser qualquer constante inteiro dentro do intervalo de 0 a 2147483647, inclusive. É possível executar a substituição de macro nos tokens de pré-processamento, mas o resultado deve ser avaliado com a sintaxe correta. filename pode ser qualquer combinação de caracteres e deve estar entre aspas duplas (" "
). Se filename for omitido, o nome de arquivo anterior permanecerá inalterado.
Você pode alterar o número de linha e o nome de arquivo de origem escrevendo uma diretiva #line
. A diretiva #line
define o valor da linha que segue imediatamente a diretiva no arquivo de origem. O conversor usa o número de linha e o nome de arquivo para determinar os valores das macros predefinidas __FILE__
e __LINE__
. Você pode usar essas macros para inserir mensagens de erro autodescritivas no texto do programa. Para obter mais informações sobre essas macros predefinidas, consulte Macros predefinidas.
A macro __FILE__
se expande em uma cadeia de caracteres cujo conteúdo é o nome de arquivo entre aspas duplas (" "
).
Se você alterar o número de linha e o nome de arquivo, o compilador irá ignorar os valores anteriores e continuar o processamento com os novos valores. A diretiva #line normalmente é usada por geradores de programas. É usado para fazer com que as mensagens de erro se refiram ao arquivo fonte original, em vez do programa gerado.
Exemplo
Os exemplos a seguir ilustram e as macros #line
, __LINE__
e __FILE__
.
No primeiro exemplo, o número de linha é definido como 10, depois para 20 e o nome do arquivo é alterado para 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
Neste exemplo, a macro ASSERT
usa as macros predefinidas __LINE__
e __FILE__
para imprimir uma mensagem de erro sobre o arquivo de origem caso uma dada "asserção" não seja válida.
#define ASSERT(cond) if( !(cond) )\
{printf( "assertion error line %d, file(%s)\n", \
__LINE__, __FILE__ );}