#line 指示詞 (C/C++)
#line 指示詞會告訴預處理器,將編譯程式針對行號和檔名的報告值設定為指定的行號和檔名。
語法
#line
digit-sequence [“filename”]
備註
編譯器會使用這個行號和選擇性檔名來指向它在編譯期間發現的錯誤。 行號通常參考目前的輸入行,檔名則參考目前的輸入檔。 每次一行程式碼處理後,行號會遞增。
數位 序列 值可以是介於 0 到內含2147483647範圍內的任何整數常數。 巨集取代可以在前置處理標記上使用,但結果必須評估為正確的語法。 檔名可以是字元的任何組合,而且必須以雙引號 (" "
) 括住。 如果 省略 filename ,則上一個檔名會保持不變。
您可以藉由撰寫 #line
指示詞來改變來源行號和檔名。 指示 #line
詞會設定緊接在原始程式檔中 指示詞後面的行值。 翻譯工具會使用行號和檔名來判斷預先定義巨集 __FILE__
和 __LINE__
的值。 您可以使用這些巨集,將自述性的錯誤訊息插入程式文字中。 如需這些預先定義巨集的詳細資訊,請參閱 預先定義的巨集。
__FILE__
巨集會展開至字串,其內容為檔名,以雙引號 (" "
) 括住。
如果您變更行號和檔名,編譯器會忽略先前的值並以新的值繼續處理。 程序產生器通常會使用 #line 指示詞。 它用來造成錯誤訊息參考原始程序檔,而不是產生的程式。
範例
下列範例說明 #line
和 __LINE__
巨集 __FILE__
。
在第一個範例中,行號會設定為 10,然後設定為 20,並將檔名變更為 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
在此範例中,巨集 ASSERT
會使用預先定義的巨集 __LINE__
,並在 __FILE__
指定的判斷提示不是 true 時列印有關來源檔案的錯誤訊息。
#define ASSERT(cond) if( !(cond) )\
{printf( "assertion error line %d, file(%s)\n", \
__LINE__, __FILE__ );}