2012-04-10 26 views
5

Tôi đã đọc những câu dưới đây và câu trả lời có vẻ rõ ràng đủ: How to concatenate twice with the C preprocessor and expand a macro as in "arg ## _ ## MACRO"?Làm thế nào để nối chuỗi với bộ tiền xử lý C với dấu chấm trong chúng?

Nhưng nếu BIẾN có một dấu chấm ở cuối?

Tôi đang cố gắng thực hiện một macro đơn giản làm tăng bộ đếm trong cấu trúc cho mục đích gỡ lỗi. Tôi có thể dễ dàng làm được điều này ngay cả khi không sự giúp đỡ từ các câu hỏi ở trên chỉ đơn giản với

#ifdef DEBUG 
#define DEBUG_INC_COUNTER(x) x++ 
#endif 

và gọi nó là

DEBUG_INC_COUNT(debugObj.var1); 

Nhưng thêm "debugObj." cho mọi macro có vẻ dư thừa. Tuy nhiên nếu tôi cố gắng nối:

#define VARIABLE debugObj. 
#define PASTER(x,y) x ## y++ 
#define EVALUATOR(x,y) PASTER(x,y) 
#define DEBUG_INC_COUNTER(x) EVALUATOR(VARIABLE, x) 
DEBUG_INC_COUNTER(var) 

gcc -E macro.c 

tôi nhận được

macro.c:6:1: error: pasting "." and "var" does not give a valid preprocessing token 

Vậy làm thế nào tôi nên thay đổi này để

DEBUG_INC_COUNTER(var); 

tạo

debugObj.var++; 

?

Trả lời

5

Bỏ qua các ##; điều này chỉ cần thiết nếu bạn muốn tham gia chuỗi. Vì đối số không phải là chuỗi, khoảng trắng giữa chúng không quan trọng (debugObj . var1 giống như debugObj.var1).

+0

D'oh! Tôi đã quá thông minh ở đó. – Makis

4

Bạn không nên dán chúng lại với nhau bằng ##, như bạn có thể có debugObj.var1 như thẻ Preprocessor riêng biệt.

Sau đây nên làm việc:

#define DEBUG_INC_COUNTER(x) debugObj.x++ 
+0

Chỉnh sửa của bạn đã xóa câu trả lời của bạn, câu trả lời của Aaron rõ ràng hơn đối với tôi ban đầu và tôi đã chấp nhận câu trả lời đó trước khi tôi xem chỉnh sửa của bạn. – Makis

+0

Tốt với tôi ... Chúc may mắn! – Lindydancer

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