回答
是的,當然,預編譯指令可以用編譯器設置。例如,gcc允許您在命令行中添加指令,您可以在Visual Studio中的項目設置中指定指令。還請考慮__cplusplus
或_LINE_
的_FILE_
。那些沒有在任何地方定義,但它們存在。還有由MSVS環境設置的_DEBUG
或UNICODE
。
可否請您提供一些更多詳細信息?謝謝。 – Iceman
首先,有一些宏由編譯器隱式定義(例如,__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?
大多數(所有?)編譯器允許定義與標誌(在GCC-D)值,還有些可能是由編譯器本身設置。
一個很好的例子:用'-DNDEBUG'(gcc)編譯禁用'assert'語句。您通常不會在頭文件中找到'NDEBUG'。目的是在命令行上(或在makefile中)定義。 –
- 1. 如何編寫擴展爲`#ifdef ...#endif`宏塊的C宏?
- 2. #ifdef #else #endif宏問題
- 3. ObjC宏ifdef和定義
- 4. JSP中C++的「#ifdef #endif」宏的等價物是什麼?
- 5. 使用宏來放置的#ifdef代碼
- 6. 如何在QML中模擬C風格的「ifdef」宏?
- 7. C++,#ifdef問題
- 8. 宏在多線使用#pragma #ifdef和
- 9. #if和#ifdef Objective-C預處理器宏有什麼區別?
- 10. 啓用靜態庫中使用的ifdef宏
- 11. 差異的#ifdef __linux #ifdef和__unix在C++頭文件
- 12. 在vim中,如何檢查我目前在裏面的#ifdef宏?
- 13. 錯誤:宏名必須是使用的#ifdef 0
- 14. #if預處理宏是否正在運行#ifdef在Objective-C的幕後?
- 15. C#定義嵌套#ifdef
- 16. C++ #ifdef Mac OS X問題
- 17. 的#ifdef
- 18. 如何編寫使用#ifdef的宏函數
- 19. emacs,#ifdef宏的顏色變化和縮進
- 20. 瞭解Linux內核中的#define #ifdef和宏
- 21. 你如何做一個ifdef後衛m4宏文件包括?
- 22. 用於重複行的C++ ifdef
- 23. 的#ifdef和之間的#if用於宏定義爲微妙差異0
- 24. ifdef&solaris
- 25. C/C++ #define宏內宏?
- 26. #ifdef,#ifndef和#undef是否與函數式宏一起工作?
- 27. 使用另一個宏生成#ifdef,#endif子句
- 28. IFDEF在Makefile.am
- 29. c&C++中的宏
- 30. 的#ifdef和的#ifndef
你可以用cl指定它。 – chris
或-D with gcc/g ++ – Joe