2010-02-03 62 views
21

Tôi đang cố gắng xác định macro giả sử lấy 2 giá trị chuỗi và trả lại chúng được nối với một dấu cách giữa chúng. Dường như tôi có thể sử dụng bất kỳ nhân vật tôi muốn ngoài không gian, ví dụ:Macro để nối hai chuỗi trong C

#define conc(str1,str2) #str1 ## #str2 
#define space_conc(str1,str2) conc(str1,-) ## #str2 

space_conc(idan,oop); 

space_conc sẽ quay trở lại "Idan-oop"

Tôi muốn một cái gì đó để trở về "Idan oop", gợi ý?

Trả lời

48

Hãy thử

#define space_conc(str1,str2) #str1 " " #str2 

Các '##' này được sử dụng để nối các biểu tượng, không dây. Các chuỗi đơn giản có thể được sắp xếp trong C, và trình biên dịch sẽ nối chúng lại, đó là những gì macro này làm. Đầu tiên, biến str1 và str2 thành chuỗi (giả sử "hello" và "world" nếu bạn sử dụng nó như thế này space_conc(hello, world)) và đặt chúng cạnh nhau với đơn giản, không gian, chuỗi inbetween. Đó là, việc mở rộng kết quả sẽ được giải thích bởi trình biên dịch như thế này

"hello" " " "world" 

mà nó sẽ nối để

"hello world" 

HTH

Sửa
Để hoàn chỉnh, các '# Toán tử # 'trong macro mở rộng được sử dụng như thế này, giả sử bạn có

#define dumb_macro(a,b) a ## b 

sẽ dẫn đến việc sau đây nếu gọi là dumb_macro(hello, world)

helloworld 

mà không phải là một chuỗi, nhưng một biểu tượng và có thể bạn sẽ kết thúc với một lỗi biểu tượng không xác định nói 'helloworld' không tồn tại trừ khi bạn xác định nó trước. Điều này sẽ hợp pháp:

int helloworld; 
dumb_macro(hello, world) = 3; 
printf ("helloworld = %d\n", helloworld); // <-- would print 'helloworld = 3' 
+2

Hãy ghi nhớ điều này không nhất thiết phải câm nếu bạn đang làm một cái gì đó như 'dumb_macro (mypackage, myfunction)' ... –

+0

@R, tất nhiên khái niệm đã sử dụng, nhưng nó thường được kết nối. với một số giá trị ngữ nghĩa khác, hoặc tùy chọn để thay thế macro bằng một cái gì đó khác (chẳng hạn như, cho mục đích gỡ lỗi). Tôi không muốn đi sâu vào bất cứ thứ gì như thế, nên cái cụ thể này chỉ là một cái câm vĩ đại nối hai tên biểu tượng không có mục đích thực sự ... :) – falstro

+0

đó là một câu trả lời tuyệt vời. Muốn biết làm thế nào để làm điều đó biểu tượng nối. Nó thực sự hữu ích .. – Anubis

5
#define space_conc(str1, str2) #str1 " " #str2 
printf("%s", space_conc(hello, you)); // Will print "hello you" 
0

Quyền được làm là đặt 2 dây bên cạnh nhau. '##' sẽ không hoạt động. Chỉ cần:

#define concatenatedstring string1 string2 
Các vấn đề liên quan