2010-08-30 93 views
1

宏可以返回一個對象嗎?宏返回值

#define macro1 {obj1} 

由於宏是文本替換,我可以使用宏macro1.function1()嗎?

謝謝。

+2

你爲什麼不告訴我們你想要更大的問題解決,而不是一步。 – GManNickG 2010-08-30 07:46:55

+0

@GManNickG也許他只是想知道什麼是可能的... – 2014-08-27 08:41:21

回答

7

宏從不返回任何內容。宏將返回代碼的文本表示,該代碼將在編譯之前被粘貼到程序所在的位置。

閱讀關於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"); 

...但前面提到的模板可以做得更好。

+0

謝謝。那麼我可以在上面的例子中使用macro1.function嗎? – Steveng 2010-08-30 07:40:13

+0

是的,但這是不好的做法。但有一種情況是使用它,我將它添加到描述中。 – 2010-08-30 07:41:58

+0

然而,你的例子不適用,因爲'obj'在'{}'大括號中。 – 2010-08-30 07:50:31

6

宏在預處理步驟(編譯的七個階段的一部分)中觸發文本替換。在運行時返回一個值。這個問題沒有意義。

3

您示例的宏用{obj1}替換文本macro1。它只會將文本替換爲其他文本;它不知道對象或類的概念。

0

函數宏在C++函數的意義上並不是真正的函數:它們只是預處理指令。

您的源文件首先被預處理器讀取,宏被處理(擴展,替換等),然後將生成的源文件提供給編譯器。

因此,宏只不過是在源文件中「複製粘貼」文本。因此,您可以使用包含return語句的宏,但它只會在您的代碼中被替換。

又見Function-like macros

1

你總能看到什麼呢,編譯器做,當你定義一個宏(並調用它)的宏.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 
}