2010-02-24 36 views
5

Có thể thêm đối số mặc định trước đối số biến trong macro Vĩ độ không? ví dụ tôi có phiên bản của vĩ mô cái gì đó nhưThêm đối số mặc định vào macro VARA

#define MACRO(arg1, ...) func(arg1, ##__VA_ARGS__) 

Tôi muốn thêm 2 đối số mặc định ở những vĩ mô trước khi lập luận biến để nó không ảnh hưởng đến phiên bản trước. Giống như:

#define MACRO(arg1, arg2 = "", arg3 = "", ...) func(arg1, arg2, arg3, ##__VA_ARGS__) 

Mọi trợ giúp sẽ được đánh giá cao.

+1

C không hỗ trợ đối số mặc định. Bạn có nghĩa là C + +? –

+0

Không chắc chắn Trong hiểu, sẽ không

#define MACRO(arg1, ...) func(arg1, "", "", ##__VA_ARGS__)
hoạt động? – philant

+0

Có. Quên đề cập đến. Nó dành cho C++. Cảm ơn – vishal

Trả lời

4

Tôi không nghĩ điều này là có thể. Trình biên dịch/bộ tiền xử lý sẽ biết nếu đối số thứ hai và thứ ba là một phần của các đối số biến hoặc ghi đè các giá trị mặc định? Đó là lý do tại sao các tham số có giá trị mặc định phải ở vị trí cuối cùng trong một hàm.

Tôi sợ bạn sẽ phải có hai macro hoặc ba nếu bạn có thể chỉ định arg2 và sử dụng giá trị mặc định arg3, nhưng điều này là dễ bị lỗi.

#define MACRO(arg1, ...) func(arg1, "", "", ##__VA_ARGS__) 
#define MACRO2(arg1, arg2, ...) func(arg1, arg2, "", ##__VA_ARGS__) 
#define MACRO3(arg1, arg2, arg3, ...) func(arg1, arg2, arg3, ##__VA_ARGS__) 
5

Những gì bạn có thể làm:

struct foo { 
    int aaa; 
    char bbb; 
    char *ccc; 
}; 

#define BAR(...) bar((struct foo){__VA_ARGS__}) 

void bar(struct foo baz) 
    /* set defaults */ 
    if (!baz.aaa) 
     baz.aaa = 10; 
    if (!baz.bbb) 
     baz.bbb = 'z'; 
    if (!baz.ccc) 
     baz.ccc = "default"; 

    printf("%d, %c, %s\n", baz.aaa, baz.bbb, baz.ccc); 
} 

... 
BAR();      // prints "10, z, default" 
BAR(5);     // prints "5, z, default" 
BAR(5,'b');    // prints "5, b, default" 
BAR(5, 'b', "something"); // prints "5, b, something" 

điều Bad về điều này - không tham số được đối xử như không có tham số, ví dụ BAR(0, 'c') sẽ tạo ra chuỗi 10, c, default

+0

Thật không may, điều này sẽ không thực hiện thủ thuật nếu các đối số được đặt mặc định có nghĩa là nhập tên. – PSkocik

+0

@PSkocik Ý của bạn là gì? Bạn có thể vui lòng xây dựng? – qrdl

0

Không như một câu trả lời cho câu hỏi của bạn, nhưng như là một cách đơn giản là giải quyết vấn đề của bạn:

#define MACRO(arg1, ...)   \ 
    /* pre-treatment */   \ 
    func(arg1, ##__VA_ARGS__)  \ 
    /* post-treatment */   \ 

void func (type1 arg1, type2 arg2 = "", type3 arg3 = "", ...); 
Các vấn đề liên quan