2012-12-11 26 views
14

Tôi muốn thêm một số macro để giảm bớt (un) thiết lập cảnh báo cụ thể về các thói quen mà chúng tôi đang phản đối nội bộ.Làm thế nào để xác định macro với nhiều pragma cho Clang?

Tôi muốn tắt chức năng này:

#pragma clang diagnostic push 
#pragma clang diagnostic warning "-Wdeprecated-declarations" 

void Foo() __attribute__((deprecated("Warning: deprecated routine"))) 

#pragma clang diagnostic pop 

vào đây:

MY_DEPRECATED_BEGIN 

void Foo() MY_DEPRECATED 

MY_DEPRECATED_END 

Các MY_DEPRECATED_BEGIN vĩ mô được đem lại cho tôi rắc rối như tôi phải đặt thiết hai pragmas trong một macro duy nhất. Điều này có thể được thực hiện?

(điểm thưởng cho một giải pháp mà đạt được tác dụng tương tự chỉ sử dụng vĩ mô MY_DEPRECATED!)

Trả lời

15
void Foo() __attribute__((deprecated)); 

#define MY_DEPRECATED_BEGIN \ 
    _Pragma("clang diagnostic push") \ 
    _Pragma("clang diagnostic warning \"-Wdeprecated-declarations\"") 


int main() 
{ 
MY_DEPRECATED_BEGIN 
    Foo(); 
#pragma clang diagnostic pop 
} 

Câu trả lời ngắn cho câu hỏi kỹ thuật của bạn là C99 cung cấp _Pragma("foo") xây dựng, đó là tương đương với #pragma foo nhưng được xử lý một chút sau đó và không cần phải nằm trên một dòng.

Vấn đề khác của bạn là -Wdeprecated-declarations không làm những gì bạn nghĩ. Chỉ cần tuyên bố một chức năng không được chấp nhận sẽ không bao giờ cung cấp cho bạn chẩn đoán, bởi vì __attribute__((deprecated))được cho là để được sử dụng (thường trong các tệp tiêu đề). Điều gì gây ra chẩn đoán là nếu bạn sử dụng chức năng không được dùng nữa - và tại số , rằng cài đặt -Wdeprecated trở nên có liên quan.

Nếu bạn thực sự chỉ muốn không chấp nhận Foo iff MY_DEPRECATED được thiết lập, sau đó đúng cách để làm rằng

#ifdef MY_DEPRECATED 
#define ATTRIBUTE_DEPRECATED __attribute__((deprecated)) 
#else 
#define ATTRIBUTE_DEPRECATED 
#endif 

void Foo() ATTRIBUTE_DEPRECATED; 
+0

Đã lưu cho tôi rất nhiều thời gian. Cảm ơn! – mrvincenzo

4

Bạn có thể sử dụng giải pháp này:

#define NS_SUPPRESS_DIRECT_USE(expr) _Pragma("clang diagnostic push") \ 
             _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")\ 
             expr\ 
             _Pragma("clang diagnostic pop") 

Sau đó, chỉ cần thêm nó:

NS_SUPPRESS_DIRECT_USE(
         Foo(); 
        ); 
Các vấn đề liên quan