宏返回值
回答
宏從不返回任何內容。宏將返回代碼的文本表示,該代碼將在編譯之前被粘貼到程序所在的位置。
閱讀關於C Preprocessor。
所以:
#define macro1 {obj1}
int main() {
macro1
}
,如果你寫
int main() {
{obj1}
}
這只是文本替換,即可以選擇帶一個參數...會被編譯。
如果你使用GCC,你可以看看該程序將是什麼樣子的預處理後,用cpp
工具:
# cpp myprog.cpp myprog.cpp_out
一般混合宏的使用對象是不好的做法,使用代替templates。
一個從對象的角度宏的已知用途使用它們來訪問單身(但不是一般的這樣一個不錯的主意):
#define LOGGER Logger::getLogger()
...
LOGGER->log("blah");
你也可以使用預處理程序在編譯時選擇要使用的對象:
#ifdef DEBUG
# define LOGGER DebugLogger
#else
# define LOGGER Logger
#end
// assuming that DebugLogger and Logger are objects not types
LOGGER.log("blah");
...但前面提到的模板可以做得更好。
謝謝。那麼我可以在上面的例子中使用macro1.function嗎? – Steveng 2010-08-30 07:40:13
是的,但這是不好的做法。但有一種情況是使用它,我將它添加到描述中。 – 2010-08-30 07:41:58
然而,你的例子不適用,因爲'obj'在'{}'大括號中。 – 2010-08-30 07:50:31
宏在預處理步驟(編譯的七個階段的一部分)中觸發文本替換。在運行時返回一個值。這個問題沒有意義。
您示例的宏用{obj1}
替換文本macro1
。它只會將文本替換爲其他文本;它不知道對象或類的概念。
函數宏在C++函數的意義上並不是真正的函數:它們只是預處理指令。
您的源文件首先被預處理器讀取,宏被處理(擴展,替換等),然後將生成的源文件提供給編譯器。
因此,宏只不過是在源文件中「複製粘貼」文本。因此,您可以使用包含return
語句的宏,但它只會在您的代碼中被替換。
你總能看到什麼呢,編譯器做,當你定義一個宏(並調用它)的宏.The代碼被簡單地更換(就像複製粘貼)。
用gcc -E編譯。 例如,對於這個代碼
#define macro1 {obj1}
int main() {
int obj1;
macro1
}
在有GCC -E example.c編譯我得到下面的輸出
# 1 "macro.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "macro.c"
int main() {
int obj1;
{obj1} //here your call gets expanded
}
- 1. 宏返回值
- 2. 從Clojure的宏返回宏
- 3. 檢查宏中函數的返回值
- 4. 功能像宏返回一個值
- 5. 如何從C宏返回值?
- 6. 函數返回宏?
- 7. 靜態返回類型宏
- 8. CMake宏從流中返回?
- 9. 從宏返回整數
- 10. Extjs,返回Ajax返回值
- 11. 返回返回標值
- 12. 隨機數宏不會返回所希望的值
- 13. Excel宏輸入型不返回正確的值
- 14. 什麼是由以下的返回值宏
- 15. 宏返回值不匹配函數類型
- 16. 訪問像宏一樣的函數返回值
- 17. 將指針返回到宏中的某個值?
- 18. Corretc Excel VBA宏以文本和日期形式返回值
- 19. 返回取回值
- 20. 爲什麼函數的返回值沒有被評估,但宏的返回值是?
- 21. VBA宏返回運行時錯誤'5'
- 22. 以RPM停止/退出/返回宏
- 23. C宏/函數返回多種類型
- 24. 宏返回類型取決於參數
- 25. 如何防止宏返回到Gosub
- 26. Google Test中的「斷言並返回」宏?
- 27. 將事情從Word宏返回到PHP
- 28. C宏返回類型的變量
- 29. 使用宏C編程返回
- 30. Hive宏未返回預期結果
你爲什麼不告訴我們你想要更大的問題解決,而不是一步。 – GManNickG 2010-08-30 07:46:55
@GManNickG也許他只是想知道什麼是可能的... – 2014-08-27 08:41:21