Frage

Was ist die nächste GCC entspricht diesen MSVC Präprozessor Code?

#pragma warning( push )                    // Save the current warning state.
#pragma warning( disable : 4723 )          // C4723: potential divide by 0
// Code which would generate warning 4723.
#pragma warning( pop )                     // Restore warnings to previous state.

Wir haben Code in der gemeinsam enthalten Header, die wir nicht wollen, eine spezifische Warnung zu erzeugen. Allerdings wollen wir Dateien, die diese Header weiterhin zu generieren sind, dass Warnung (wenn das Projekt hat die Warnung aktiviert ist).

War es hilfreich?

Lösung

Dies ist möglich in GCC seit Version 4.6, oder etwa im Juni 2010 in dem Kofferraum.

Hier ist ein Beispiel:

#pragma GCC diagnostic push
#pragma GCC diagnostic error "-Wuninitialized"
    foo(a);         /* error is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
    foo(b);         /* no diagnostic for this one */
#pragma GCC diagnostic pop
    foo(c);         /* error is given for this one */
#pragma GCC diagnostic pop
    foo(d);         /* depends on command line options */

Andere Tipps

Die nächste Sache ist die GCC Diagnose Pragma , #pragma GCC diagnostic [warning|error|ignored] "-Wwhatever". Es ist nicht ganz in der Nähe, was Sie wollen, und den Link für Details und Einsprüche sehen.

Ich habe etwas ähnliches getan. Für Drittanbieter-Code wollte ich überhaupt keine Warnungen sehen. Also, anstatt -I/path/to/libfoo/include angeben, habe ich -isystem /path/to/libfoo/include. Dies macht den Compiler diese Header-Dateien als „System-Header“ für die Zwecke der Warnungen behandeln, und so lange, wie Sie ermöglichen nicht -Wsystem-headers, sind Sie meist sicher. Ich habe noch ein paar Warnungen gesehen von dort auslaufen, aber es schneidet sich auf die meisten der Müll.

Hinweis

, dass diese nur hilft Ihnen, wenn Sie den problematischen Code isolieren kann durch include-Verzeichnis. Wenn es nur eine Teilmenge des eigenen Projektes ist, oder mit anderem Code vermischte, bist du kein Glück.

Dies ist eine Erweiterung auf Matt Tischler Antwort .

Wenn Sie nicht pragmas ganzen Code, um laichen wollen, können Sie die _ Pragma Operator :

#ifdef __GNUC__
#  define DIAGNOSTIC_ERROR(w) _Pragma("GCC diagnostic error \"" w "\"")
#  define DIAGNOSTIC_IGNORE(w) _Pragma("GCC diagnostic ignore \"" w "\"")
#  define DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
#  define DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
#endif
// (...)

DIAGNOSTIC_ERROR("-Wuninitialized")
foo(a); // Error

DIAGNOSTIC_PUSH
DIAGNOSTIC_IGNORE("-Wuninitialized")
foo(a); // No error

DIAGNOSTIC_POP
foo(a); // Error
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top