2009-11-28 25 views
5
#define f(g,g2) g##g2 
main() 
{ 
int var12=100; 
printf("%d",f(var,12)); 
} 

Chương trình trên in 100 in c bằng cách nối var và 12. Cách g ## g2 hoạt động?#define f (g, g2) g ## g2

+2

Đây không phải là một chương trình, đó là một macro. Tra cứu "token-pasteing operator" trong cuốn sách ngôn ngữ C/C++ yêu thích của bạn. –

+2

@nobugz: cái gì? Ở trên * là * một chương trình, mặc dù không hoàn toàn hợp pháp C. Và chương trình in 100. Có một macro trong chương trình chắc chắn, nhưng trong câu nói, "chương trình trên in 100", là Shishir không đề cập, chính xác, với toàn bộ chương trình và không cho vĩ mô? –

Trả lời

8

## chỉ cần dán mã thông báo cùng nhau. Nó là một chỉ thị tiền xử lý.

Ví dụ:

#define PASTE(a,b) a##b 

int i=PASTE(1,2); /* int i=12; */ 
0

là bộ tiền xử lý "lệnh" để ghép những gì đến trước và sau.

0

Vì vậy, sau khi xử lý trước nó sẽ giống như thế này:

main() 
{ 
int var12=100; 
printf("%d",var12); 
} 
0

Đây là dán mã thông báo, miêu tả here cho gcc. Dán mã thông báo được thực hiện bởi bộ tiền xử lý, không phải trình biên dịch.

0

Kết nối đang được thực hiện bởi bộ tiền xử lý vì bạn đã sử dụng lệnh ##.

Khi bạn không chắc chắn tiền xử lý đang làm gì, bạn có thể yêu cầu gcc dừng sau khi nó đã chạy bộ tiền xử lý. Vì đây là trước khi trình biên dịch chạy, đầu ra khá dễ hiểu.

Ví dụ, giả sử bạn có một tập tin pre.c

#define FOO 123 
#define CONCAT(x,y) x##y 
#define STRING(x) #x 

void main() 
{ 
    int a = FOO; 
    int b = CONCAT(123,4567); 
    char* c = STRING(IGetQuoted); 
} 

Bạn có thể tạo ra sản lượng tiền xử lý bằng cách thông qua các tùy chọn -E để gcc.

$ gcc -E pre.c 
# 1 "pre.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "pre.c" 




void main() 
{ 
    int a = 123; 
    int b = 1234567; 
    char* c = "IGetQuoted"; 
} 

Hãy ghi nhớ rằng #include sẽ lấy nội dung của tệp được chỉ định và có thể làm cho đầu ra tiền xử lý khá dài.

+0

-1 (không thực sự) cho 'void main()'! – pmg