2013-09-23 66 views
6

Tôi đã cố gắng để thực hiện một macro hàm trong C prepends "DEBUG:", để lập luận, và vượt qua đối số của nó để printf:Lỗi khi định nghĩa một macro stringising với __VA_ARGS__

#define DBG(format, ...) printf("DEBUG: " #format "\n", __VA_ARGS__) 

này mang lại cho tôi lỗi này trong gcc:

src/include/debug.h:4:70: error: expected expression before ‘)’ token 
#define DBG(format, ...) printf("DEBUG: " #format "\n", __VA_ARGS__) 
                   ^

Giả sử, nó phải định dạng chuỗi và chuyển đối số biến của nó sang printf, nhưng cho đến nay tôi không thể vượt qua lỗi này.


EDIT

Sau khi từ bỏ stringising đối số, và nhấn đúp băm (##) __VA_ARGS__ bây giờ tôi có lỗi này:

src/lib/cmdlineutils.c: In function ‘version’: 
src/lib/cmdlineutils.c:56:17: warning: ISO C99 requires rest arguments to be used [enabled by default] 
    DBG("version()"); 

Tôi có nên đặt một dấu phẩy sau tranh luận?

DBG("version()",); // ? 

Để tham khảo, DBG() bây giờ trông như thế này:

#define DBG(format, ...) printf("DEBUG: " format "\n", ##__VA_ARGS__) 
+0

trình cho tôi trên gcc, mà trình biên dịch bạn đã sử dụng không? Bạn có thể thử đặt khoảng cách giữa # và định dạng không? – Leeor

+0

$ gcc --version: gcc (GCC) 4.8.1 20130725 (prerelease) –

Trả lời

8

Điều này xảy ra trừ khi có ít nhất một biến đối số. Bạn có thể thử mở rộng GNU này để sửa chữa nó:

#define DBG(format, ...) printf("DEBUG: " #format "\n", ##__VA_ARGS__) 
                 ^^ 

Như đã giải thích in the GNU doc:

[if] the variable argument is left out when the macro is used, then the comma before the ‘##’ will be deleted.

+0

thật không may, điều này không khắc phục được cho tôi, xem chỉnh sửa –

+0

@marcoms Khá lạ, bạn có chắc là bạn đã sao chép chính xác dòng không? – cnicutar

+0

ký tự duy nhất bị thiếu trong định nghĩa của tôi là băm ('#') trước 'định dạng', vì tôi quyết định xâu chuỗi đối số khi tự gọi nó, để loại bỏ một nguyên nhân có thể, tức là:' DBG ("printf () ");' –

0

Check out this trên MSDN. Nó chứa thông tin về Variadic Macros, đó là những gì bạn đang sử dụng.

0

Tại sao bạn cần phải định dạng chuỗi, nó có thể giữ nguyên, chỉ coi nó như một chuỗi khi sử dụng macro.

Lỗi, như cnicutar propsed có thể được giải quyết với cách thêm '##' trước khi VA_ARGS

#define DBG(format, ...) printf("DEBUG: " format "\n", ##__VA_ARGS__) 

dụ Cách sử dụng:

DBG("%d - %s", a,b);