2012-12-11 13 views
14

Chciałbym dodać kilka makr, aby ułatwić (nie) ustawienie określonego ostrzeżenia o procedurach, które wycofujemy wewnętrznie.Jak zdefiniować makro z wieloma pragma dla Clang?

Chciałbym włączyć to:

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

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

#pragma clang diagnostic pop 

do tego:

MY_DEPRECATED_BEGIN 

void Foo() MY_DEPRECATED 

MY_DEPRECATED_END 

MY_DEPRECATED_BEGIN makro daje mi kłopoty jak mam określić dwa pragma w jednym makro. Czy można to zrobić?

(punkty za rozwiązanie, które daje ten sam efekt przy użyciu tylko MY_DEPRECATED makro!)

Odpowiedz

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 
} 

Krótka odpowiedź na swoje pytanie techniczne jest, że C99 zapewnia _Pragma("foo") konstrukt, który jest odpowiednikiem #pragma foo ale przetwarzany jest nieco później i nie musi być sam w sobie.

Twój inny problem polega na tym, że -Wdeprecated-declarations nie robi tego, co myślisz. Po prostu zadeklarowanie funkcji jako przestarzałe nigdy nie da ci diagnozy, ponieważ __attribute__((deprecated)) jest rzekomo do użycia (zazwyczaj w plikach nagłówkowych). To, co powoduje diagnostykę, to: jeśli używasz , używasz przestarzałej funkcji - i jest to , które wskazuje, że ustawienie -Wdeprecated staje się odpowiednie.

Jeśli naprawdę chcą się potępiać Foo IFF MY_DEPRECATED jest ustawiony, a następnie w odpowiedni sposób do zrobienia że jest

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

void Foo() ATTRIBUTE_DEPRECATED; 
+0

Zaoszczędziliście dużo czasu. Dzięki! – mrvincenzo

4

Można użyć tego rozwiązania:

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

Następnie wystarczy dodać to:

NS_SUPPRESS_DIRECT_USE(
         Foo(); 
        );