[英]c++ - #ifdef macro
我可以看到
#ifdef <token>
code;
#endif
包含在內,但我找不到它包含在任何標頭中的定義。 還有其他可以用來定義令牌的機制嗎?
首先,存在編譯器隱式定義的宏(例如__cplusplus
)。 其中有些是標准的,有些是編譯器特定的擴展。 有關完整列表,請參見編譯器手冊 。
另外,大多數編譯器允許在命令行上定義宏。 確切的機制取決於編譯器,但是通常采用-D
或/D
命令行選項的形式。 例如,請參見gcc
手冊 :
-D name
將名稱預定義為宏,定義為1。
-D name=definition
定義的內容被標記和處理,就像它們出現在翻譯的第三階段中的#define指令中一樣。 特別是,該定義將被嵌入的換行符截斷。 如果要從Shell或類似Shell的程序中調用預處理器,則可能需要使用Shell的引號語法來保護字符,例如在Shell語法中具有含義的空格。
如果要在命令行上定義類似函數的宏,請在等號之前(如果有的話)在參數列表中加上括號。 括號對大多數shell有意義,因此您需要引用該選項。 使用sh和csh,-D'name(args ...)= definition'有效。
對於Microsoft Visual C ++,請參見http://msdn.microsoft.com/zh-cn/library/hhzbb5c8(v=vs.80).aspx
一些編譯器提供了方便的工具來確定在哪里定義了特定的預處理器宏。 參見,例如, 如何知道(在GCC中)何時聲明給定的宏/預處理器符號?
大多數(全部?)編譯器都允許使用標志(在gcc中為-D)定義值,也有一些可由編譯器本身設置。
是的,當然可以在編譯器中設置預處理程序指令。 例如,gcc允許您在命令行中添加指令,您可以在Visual Studio的項目設置中指定指令。 還要考慮__cplusplus
或_LINE_
的_FILE_
。 這些沒有在任何地方定義,但它們存在。 也是由MSVS環境設置的_DEBUG
或UNICODE
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.