g ++ verwenden und mit -Waggregate-return
versucht zu schweigen -Weggregate-Return nur in einem Makro für g ++ - Buggy Compiler?
#define DOCTEST_CHECK(expr) \
do { \
_Pragma("GCC diagnostic push"); \
_Pragma("GCC diagnostic ignored \"-Waggregate-return\"");\
if(Result failed = (ExpressionDecomposer() << expr)) \
printf("%s\n", failed.m_decomposition.c_str()); \
_Pragma("GCC diagnostic pop"); \
} while(false)
DOCTEST_CHECK(true == false); // produces warnings
aber die abgerollt von Hand Version Warnungen nicht produzieren Kompilieren:
do {
_Pragma("GCC diagnostic push");
_Pragma("GCC diagnostic ignored \"-Waggregate-return\"");
if(Result failed = (ExpressionDecomposer() << true == false))
printf("%s\n", failed.m_decomposition.c_str());
_Pragma("GCC diagnostic pop");
} while(false);
Sollte das Verhalten nicht gleich sein?
Ich glaube nicht, dass die Result
und ExpressionDecomposer
Typen zählen - nur Klassen.
Ich versuche, Expression-Dekomposition funktioniert wie here (Dinge wurden ein bisschen umbenannt).
EDIT: >>here < < ist eine Live-Demo des Problems mit der damit Bibliothek
Meine Frage ist: Warum? Wie kann ich im ersten Fall mit dem Makro kostenlos warnen? Ich kann es mir nicht leisten, die Warnung global zum Schweigen zu bringen.
Ich weiß, dass dies die Frage nicht beantwortet, aber "-Weggregate-Return" scheint ziemlich pedantisch und sollte ignoriert werden, besonders in C++, wo die Rückgabe per Wert völlig normal ist. Sie können sich [diese Frage] ansehen (http://stackoverflow.com/questions/14016993/confusion-in-regrates-to-purpose-behavior-of-waggregate-return). –
Ich erinnere mich vage daran, dass GCC Probleme mit Pragmas in Makros hat; Vielleicht möchten Sie ihre Bugzilla suchen. –
@AlexandreC. Ich würde diese Warnung nie für persönlichen Code verwenden, aber die Bibliothek, die ich schreibe, soll sogar auf den aggressivsten Ebenen komplett warnen (ich leide an Perfektionismus) ... Auch diese Warnung ist nicht in '' -Wall' '' '' '' '-Wextra''' aus gutem Grund ... – onqtam