Đối với các trình gỡ lỗi, tôi thường sử dụng Clang, vì nó định dạng cảnh báo và lỗi tốt hơn và giúp bạn dễ dàng theo dõi chúng hơn và sửa chúng.Macro biến thể không chuẩn?
Nhưng thời gian gần đây sau khi thêm một Macro với đối số variadic, Clang nói với tôi như sau (từ một dự án dummy):
main.cpp:5:20: warning: named variadic macros are a GNU extension [-Wvariadic-macros]
#define stuff3(args...) stuff_i(args)
Tôi biết rằng macroname(args...)
biên dịch tốt trong một loạt các trình biên dịch, bao gồm VisualStudio, Sunstudio và tất nhiên là GCC. Nhưng chỉ để chắc chắn rằng kêu vang là đúng, tôi đã cố gắng hai cách khác để mở rộng các đối số variadic:
Số 1:
#define stuff1(...) stuff_i(...)
Số 2:
#define stuff2(...) stuff_i(__VA_ARGS__)
Trên cả tôi nhận được tin nhắn:
main.cpp:3:16: warning: variadic macros were introduced in C99 [-Wvariadic-macros]
... Điều này khiến tôi tự hỏi liệu macro Variadic có thực sự là một phần tiêu chuẩn của C++ hay không nd tất nhiên tôi biết rằng Preprocessor được giải thích một cách độc lập)?
C99 và C++ 0x chính thức hỗ trợ phiên bản 2. C++ 03 không hỗ trợ bất kỳ macro variadic.Phiên bản 1 là một phần mở rộng cụ thể GCC – sellibitze
(như tên của bạn) khi bạn biên dịch với GCC có tùy chọn '-pedantic' sẽ báo cáo các phần mở rộng được sử dụng. Ví dụ như Variable Length Array hoặc Variadic Macros. Trong GCC, chúng được bao gồm đơn giản bởi vì vì chúng là một phần của C99, nên logic đã được thực hiện, vì vậy nó phải có ý tưởng tốt để cho lợi ích dân gian C++ :) –
@Matthieu M: Đúng vậy, tôi cũng nghĩ rằng tính năng này sẽ là một phần của C++, vì nó đã là một phần của C99 ... thú vị, gcc không nói rằng tên là variadic macro thực sự là một phần mở rộng GNU, nhưng thay vì chỉ nói rằng chúng không phải là một phần của tiêu chuẩn: 'warning: ISO C không cho phép tên là variadic macros' –