2012-07-23 42 views
7

Tôi muốn biết lý do đằng sau đầu ra của mã này. Tôi không thể đưa ra câu trả lời.C tiền xử lý: xâu chuỗi macro và nhận dạng macro

#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: đầu ra là 12 f(1,2). Tôi nghĩ rằng đó là 12 12 hoặc f(1,2) f(1,2).

+3

chỉ để tìm hiểu tiền xử lý làm việc ... – Dhatri

+3

@cnicutar Tôi nghĩ rằng ông đã tìm thấy nó ở đây: http://cracktheinterviewers.blogspot.com/2012_03_01_archive.html – Dave

+0

nó không được viết bởi tôi .. nó đã được yêu cầu trong một thử nghiệm. – Dhatri

Trả lời

4
h(f(1,2)) 

f(1,2) được thay thế cho a. a không phải là chủ thể của nhà điều hành # hoặc ## do đó nó được mở rộng đến 12. Bây giờ bạn có g(12) mở rộng đến "12".

g(f(1,2)) 

f(1,2) được thay thế cho a. Toán tử # áp dụng cho a ngăn chặn việc mở rộng macro, do đó kết quả theo nghĩa đen là "f(1,2)".

+0

oh ... ok cảm ơn ... tôi đã không tập trung vào các hoạt động của # nhà điều hành – Dhatri

+0

@vindhya Đó là tất cả một mớ hỗn độn đẫm máu. – Potatoswatter

2

Chỉ cần thực hiện thay thế.

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

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

Bạn cũng sẽ thấy here.

+0

cho thứ hai cũng g (f (1,2)) có thể là g (12) và 12 phải không? – Dhatri

Các vấn đề liên quan