2013-06-21 24 views
-4

我有一個宏觀宣佈爲:在使用__FILE__和__LINE__一個用戶定義的宏

#define Ex(a) { throw MyException((a), __LINE__, __FILE__); } 

而且我使用它是這樣的:

if (bad_things_happen) Ex(error_code) 

將這些宏包含行以及#define聲明文件或if聲明?如果它們所包含的#define語句的行和文件,然後我的宏是基本上是無用的...

+6

爲什麼你不測試它並找出 – aaronman

回答

1

不,它擴展到你使用它的行號:

__LINE__此宏擴展到當前輸入行號,以十進制整數常量的形式表示。雖然我們把它稱爲預定義的宏,但它是一個非常奇怪的宏,因爲它的「定義」隨着每一行新的源代碼而改變。

至於文件:

__FILE__此宏擴展到當前輸入文件的名稱,在C字符串常量的形式。這是預處理程序打開文件的路徑,而不是在'#include'中指定的短名稱或輸入文件名稱參數。例如,「/usr/local/include/myheader.h」是這個宏的一個可能的擴展。

+0

......但在這種情況下,「你使用它的地方」是什麼意思? – creXALBO

+1

@creXALBO它會展開到當前行,而不是宏定義的位置。宏只是文本替換。 – 0x499602D2

+1

creXALBO的問題是相當有效的......一個宏只是文本替換實際上沒有幫助解釋,因爲正如文字所說,「__LINE__」是一個「非常奇怪」的宏,*不是*簡單的文本替換,因爲它的價值變化。您應該澄清您的答案,以指定「__LINE__」具有展開的源代碼行的值,而不是文本出現的位置。 (您上面的評論不是答案的一部分。) –

相關問題