2012-11-05 60 views
1

我可以看到C++ - 的#ifdef宏

#ifdef <token> 
code; 
#endif 

被包括,但我不能發現它在它包括標頭的定義。是否有任何其他機制可以定義令牌?

+0

你可以用cl指定它。 – chris

+0

或-D with gcc/g ++ – Joe

回答

1

是的,當然,預編譯指令可以用編譯器設置。例如,gcc允許您在命令行中添加指令,您可以在Visual Studio中的項目設置中指定指令。還請考慮__cplusplus_LINE__FILE_。那些沒有在任何地方定義,但它們存在。還有由MSVS環境設置的_DEBUGUNICODE

+0

可否請您提供一些更多詳細信息?謝謝。 – Iceman

4

首先,有一些宏由編譯器隱式定義(例如,__cplusplus)。其中一些是標準的,一些是編譯器特定的擴展。查看您的compiler manual獲取完整列表。

此外,大多數編譯器允許在命令行上定義宏。確切的機制依賴於編譯器,但通常採用-D/D命令行選項的形式。例如,請參見gcc manual

-D name

預定義名稱作爲一個宏,以定義1.

-D name=definition

定義的內容被標記化和處理,如同它們在出現在#define指令中翻譯第三階段。特別是,定義將被嵌入的換行符截斷。 如果您從shell或類似shell的程序中調用預處理器,則可能需要使用shell的引用語法來保護shell語法中具有含義的空格等字符。

如果您希望在命令行中定義類似函數的宏,請在等號(如果有)之前將其參數列表與周圍的圓括號一起寫入。圓括號對大多數炮彈都有意義,所以你需要引用這個選項。用sh和csh,-D'name(args ...)= definition'作品。

對於Microsoft Visual C++,見http://msdn.microsoft.com/en-us/library/hhzbb5c8(v=vs.80).aspx

一些編譯器爲搞清楚特定的預處理宏定義提供了便利的工具。見,例如,How to know (in GCC) when given macro/preprocessor symbol gets declared?

2

大多數(所有?)編譯器允許定義與標誌(在GCC-D)值,還有些可能是由編譯器本身設置。

+0

一個很好的例子:用'-DNDEBUG'(gcc)編譯禁用'assert'語句。您通常不會在頭文件中找到'NDEBUG'。目的是在命令行上(或在makefile中)定義。 –