2012-12-11 6 views
14

Ich möchte einige Makros hinzufügen, um eine bestimmte Warnung um Routinen zu erleichtern (un) zu setzen, die wir intern ablehnen.Wie definiere ich ein Makro mit mehreren Pragmas für Clang?

Ich möchte dies drehen:

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

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

#pragma clang diagnostic pop 

in diese:

MY_DEPRECATED_BEGIN 

void Foo() MY_DEPRECATED 

MY_DEPRECATED_END 

Das MY_DEPRECATED_BEGIN Makro gibt mir Mühe, wie ich zwei Pragmas in einem einzigen Makro angeben müssen. Kann das gemacht werden?

(Bonuspunkte für eine Lösung, die die gleiche Wirkung erzielt nur das MY_DEPRECATED Makro!)

Antwort

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 
} 

Die kurze Antwort auf Ihre technische Frage ist, dass C99 das _Pragma("foo") Konstrukt bereitstellt, die zu #pragma foo entspricht aber wird etwas später verarbeitet und muss nicht auf einer Zeile sein.

Ihr anderes Problem ist, dass -Wdeprecated-declarations nicht tut, was Sie denken, dass es tut. Einfach Deklaration eine Funktion als veraltet gibt Ihnen nie eine Diagnose, weil __attribute__((deprecated)) ist soll verwendet werden (in der Regel in Header-Dateien). Was die Diagnose verursacht ist, wenn Sie eine veraltete Funktion verwenden - und es ist bei , dass Punkt, dass die Einstellung -Wdeprecated relevant wird.

Wenn Sie wirklich wollen nur deprecate Foo iff MY_DEPRECATED gesetzt ist, dann den richtigen Weg dass ist

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

void Foo() ATTRIBUTE_DEPRECATED; 
+0

rettete mich sehr von Zeit. Vielen Dank! – mrvincenzo

4

Sie diese Lösung verwenden können, um zu tun:

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

Dann fügen Sie einfach es:

NS_SUPPRESS_DIRECT_USE(
         Foo(); 
        );