Gibt es eine static_warning?
Frage:
Es ist bekannt, dass Boost sorgt eine Funktion „STATISCHE WARNUNG“. Diese Frage zielt jedoch speziell darauf ab, die Möglichkeit der Implementierung einer benutzerdefinierten static_warning-Funktionalität zu untersuchen, die ähnlich wie static_assert funktioniert, aber zur Kompilierungszeit eine Warnung ausgibt, anstatt die Kompilierung abzubrechen.
Antwort:
Ja, es ist möglich, eine benutzerdefinierte static_warning-Funktion mit GCC oder MSVC zu implementieren. Die Implementierung nutzt das Makro DEPRECATE, um eine Warnung aussendende Funktion zu definieren, und verwendet eine Reihe verschachtelter Makros, um die gewünschte Funktionalität zu erstellen.
Verwendung:
Das benutzerdefinierte static_warning kann wie folgt verwendet werden:
<code class="cpp">STATIC_WARNING(condition, "Warning message here");</code>
…
Zum Beispiel gibt dieser Code eine Warnung aus:
<code class="cpp">STATIC_WARNING(true, "This warning is intended");</code>
Implementierung:
Die Implementierung basiert auf Makros, um das gewünschte Verhalten zu erreichen:
<code class="cpp">#define DEPRECATE(foo, msg) foo __attribute__((deprecated(msg))) #define STATIC_WARNING(cond, msg) ... ... struct true_type {}; struct false_type {}; template<int test> struct converter : public true_type {}; template<> struct converter<0> : public false_type {}; ... STATIC_WARNING(cond, msg) { DEPRECATE(void _(const detail::false_type&), msg) {}; void _(const detail::true_type& ) {}; PP_CAT(static_warning,__LINE__)() {_(::detail::converter<(cond)>>());} }</code>
Beispiel:
Bedenken Sie den folgenden Code:
<code class="cpp">STATIC_WARNING(1 == 1, "This is not a warning"); STATIC_WARNING(1 != 1, "This should generate a warning");</code>
Bei Kompilierung mit der entsprechenden Warnstufe löst die zweite Zeile eine Warnung aus.
Das obige ist der detaillierte Inhalt vonKönnen wir eine benutzerdefinierte „static_warning'-Funktionalität in C implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!