2012-12-12 41 views
9

Một số mã kế thừa mà tôi đang làm việc có một macro trả về một danh sách được phân cách bằng dấu phẩy nhằm mục đích được sử dụng làm đối số hàm. Điều này là xấu, nhưng tệp cấu hình chứa nhiều tệp này và sẽ khó thay đổi ngay bây giờ.Tách đối số trong bộ tiền xử lý C++

#define XY1 0,0 
#define XY2 1,7 
... 

void fun_point(x,y); 

fun_point(XY1); 

Tính năng này hoạt động miễn là chức năng được gọi. Tuy nhiên, khi cố gắng gọi một vĩ mô với các thông số, toàn bộ chuỗi được coi là một lập luận chứ không phải là phân chia theo dấu phẩy vào hai đối

#define MAC_POINT(x,y) (x+y) 
MAC_POINT(XY1) #not expanded by preprocessor 

Có một cách giải quyết cho vấn đề này mà không thay đổi định nghĩa XY?

+2

/tôi lắc nắm tay tại mã cũ – icabod

+1

Tôi đã tìm thấy một cuộc thảo luận hoặc vấn đề này trong hướng dẫn GCC: http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan – Quantum7

Trả lời

13

Kinda. Các công trình sau:

#define MAC_POINT(x,y) (x+y) 
#define MAC_POINT1(xy) MAC_POINT(xy) 
#define XY x,y 
MAC_POINT(x,y) 
MAC_POINT1(XY) 

Tuy nhiên, bạn phải thay đổi từ MAC_POINT thành MAC_POINT1 nếu bạn chỉ có một đối số.

Một khả năng khác là:

#define MAC_POINT(x,y) (x+y) 
#define MAC_POINT1(xy) MAC_POINT xy 
#define XY x,y 
MAC_POINT1((x,y)) 
MAC_POINT1((XY)) 

Bây giờ bạn phải thay đổi tất cả các cuộc gọi của bạn đến vĩ mô, nhưng ít nhất họ nhất quán.

+0

Ah, tôi nghĩ rằng tôi thấy lý do tại sao mức độ thêm của indirection là cần thiết. Cảm ơn! – Quantum7

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