2011-07-19 25 views
9

Sử dụng lệnh saucảnh báo GCC: ISO C không cho phép macro variadic tên

gcc -c -Wall -Wextra -pedantic -ansi -std=c99 -fstack-protector-all -fstack-check -O3 root.c -o rootTESTOBJECT 

tôi nhận được biên dịch cảnh báo root.h: 76: 22: cảnh báo: ISO C không cho phép macro variadic tên

72 #ifdef Debug 
73 #include <stdio.h> 
74 #define crumb(phrase0...) printf(phrase0) 
75 #else 
76 #define crumb(phrase0...) 
77 #endif 

tôi tin rằng các tùy chọn -ansi -std = c99 cho phép việc sử dụng các macro variadic, nó theo các tài liệu anyway ...

Tôi đã thử chỉnh sửa dòng 76 đến

76 #define crumb(phrase0...) printf("") 

để xem điều này đã khắc phục cảnh báo nhưng không có niềm vui.

verion biên dịch là gcc của Apple, phiên bản 4.2.1 Tôi không chắc liệu mình có quá quan tâm đến điều này hay không nhưng tôi thực sự không thích cảnh báo. Tôi đang bỏ lỡ lá cờ nào?

Trả lời

18

#define crumb(phrase0...) <whatever> đặt tên (phrase0) vào đối số biến (...).

Đây là GCC extension.

C99 xác định cách chuyển đối số biến cho macro (xem §6.10.3/12 và §6.10.3.1/2): đối số biến không được đặt tên ở phía bên trái của các định nghĩa (ví dụ: ...), và tham chiếu ở phía bên tay phải như __VA_ARGS__, như thế này:

#define crumb(...) printf(__VA_ARGS__) 

(Bằng cách này, gcc lập luận của bạn không nên bao gồm cả -ansi-std=c99: -ansi quy định cụ thể tiêu chuẩn C trước đó (còn gọi là ANSI C, C89 hoặc C90), kết hợp cả hai tùy chọn chỉ xảy ra t o chọn C99 trong trường hợp này vì -std=c99 xuất hiện sau-ansi trong danh sách đối số và người cuối cùng thắng.)

+0

cảm ơn bạn đã sửa nó – lbdl

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