2012-07-23 81 views
7

我想知道此代碼輸出背後的原因。我無法想出答案。C預處理器:字符串宏和標識宏

#define f(a,b) a##b 
#define g(a) #a 
#define h(a) g(a) 
void main() 
{ 
    printf("%s %s",h(f(1,2)),g(f(1,2))); 
} 

PS:輸出是12 f(1,2)。我以爲這是12 12f(1,2) f(1,2)

+3

只是爲了學習預處理器的工作... – Dhatri 2012-07-23 09:50:54

+3

@cnicutar我認爲他在這裏找到它:http://cracktheinterviewers.blogspot.com/2012_03_01_archive.html – Dave 2012-07-23 09:51:19

+0

它不是由我寫的..它在測試中被問到。 。 – Dhatri 2012-07-23 09:52:17

回答

4
h(f(1,2)) 

f(1,2)被替換爲aa不是###運營商的主題,因此它已擴展到12。現在你有g(12),它擴大到"12"

g(f(1,2)) 

f(1,2)代替a。應用於a#運算符可防止宏擴展,因此結果字面上爲"f(1,2)"

+0

哦......好的謝謝......我沒有專注於#運營商的運作 – Dhatri 2012-07-23 10:07:50

+0

@vindhya這一切都是一個血腥的混亂。 – Potatoswatter 2012-07-23 10:08:34

2

只要做替換。

h(f(1, 2)) -> g(12) -> "12" 

g(f(1,2)) -> "f(1, 2)" 

您還應該看到here

+0

爲第二個也是g(f(1,2))可以是g(12)和12對嗎? – Dhatri 2012-07-23 10:00:36