2014-03-14 58 views
0

對不起,我錯過了分號,現在我已經添加了。使用宏連接

#include <stdio.h> 
#define m(i,j) (i##j) 
int main(){ 
m(hello,world); 
return 0; 
} 

雖然編譯我得到以下錯誤 main.c中:在函數 '主': main.c中:8:1:錯誤: '的HelloWorld' 未聲明(第一在此函數使用) 主.C:8:1:注:每個未聲明的標識符報道只有一次出現在

#include <stdio.h> 
#define m(i,j) (i##j) 
int main(){ 
m(1,2); 
return 0; 
} 

作品完美的每個功能,並給答案12

+0

「給出的答案是12」 怎麼樣?你不輸出它。 – weston

+0

它需要一個字符串文字嗎? – BLUEPIXY

回答

0

宏被施加後,你只得到這樣的:

#include <stdio.h> 
int main(){ 
(helloworld) 
return 0; 
} 

並且編譯器會說,什麼是helloworld

+0

感謝您的幫助:) –

+1

@PuneethSrinivas不要感謝人們,只需點擊上面的upvote箭頭0. – weston

1

您必須記住預處理器完全替換宏調用。所以你的情況宏調用

m(hello,world) 

成爲

(helloworld) 

而這還不是在C.有效的語句或表達你問有關錯誤是因爲編譯器不知道什麼helloworld是,但由於缺少分號,還應該有其他錯誤。

另一個示例,其中m(1,2)被替換爲(12)至少更有效,因爲沒有未聲明的標識符。但它仍然缺少分號。

+0

感謝您的幫助:) –

0

檢查了這一點

#include <stdio.h> 
#define m(i,j) (i##j) 
int main(){ 
m('hello','world') 
return 0; 
} 
0

當你級聯都打招呼,世界,使用宏,你並沒有真正創造一個char *或燒焦[], 而是一個象徵。

因爲符號helloworld在代碼中沒有定義過,所以當然會得到一個未定義的錯誤。 爲了解決這樣的問題,你可以簡單地定義符號是一個int或任何其他原始,並把它的聲明宏之前:

int helloworld; 

然後

m(hello,world) = 10; 
printf ("%d", helloworld); 
+0

謝謝你的幫助:) –

0

你可以只需將它們放在一起即可串聯字符串。

#include <stdio.h> 
#define m(i,j) (i j) 
int main(){ 
m("hello","world"); 
return 0; 
} 

或只是

int main(){ 
"hello" "world"; 
return 0; 
}