C ++ 17 [[nodiscard]]
C ++ 17 standardisierte das "Rückgabewert ignoriertes Geschäft" mit einem Attribut.
Daher hoffe ich, dass konforme Implementierungen immer nur dann warnen, wenn dies nodiscard
angegeben ist, und niemals anders warnen.
Beispiel:
main.cpp
[[nodiscard]] int f() {
return 1;
}
int main() {
f();
}
kompilieren:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -o main.out main.cpp
Ergebnis:
main.cpp: In function ‘int main()’:
main.cpp:6:6: warning: ignoring return value of ‘int f()’, declared with attribute nodiscard [-Wunused-result]
6 | f();
| ~^~
main.cpp:1:19: note: declared here
1 | [[nodiscard]] int f() {
|
Folgendes vermeidet die Warnung:
(void)f();
[[maybe_unused]] int i = f();
Ich konnte nicht maybe_unused
direkt auf dem f()
Anruf verwenden:
[[maybe_unused]] f();
gibt:
main.cpp: In function ‘int main()’:
main.cpp:6:5: warning: attributes at the beginning of statement are ignored [-Wattributes]
6 | [[maybe_unused]] f();
| ^~~~~~~~~~~~~~~~
Die (void)
Besetzungsarbeit scheint nicht obligatorisch zu sein, wird jedoch im Standard "empfohlen ": Wie kann ich absichtlich einen Rückgabewert verwerfen?
Wie aus der Warnmeldung hervorgeht, besteht eine "Lösung" der Warnung darin, Folgendes hinzuzufügen -Wno-unused-result
:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -Wno-unused-result -o main.out main.cpp
obwohl ich natürlich nicht empfehlen würde, Warnungen global wie diese zu ignorieren.
C ++ 20 können Sie auch einen Grund, die hinzuzufügen , nodiscard
wie in [[nodiscard("reason")]]
wie erwähnt unter: https://en.cppreference.com/w/cpp/language/attributes/nodiscard
GCC- warn_unused_result
Attribut
Vor der Standardisierung von [[nodiscard]]
und für C, bevor sie sich endgültig für die Standardisierung von Attributen entscheiden, hat GCC genau dieselbe Funktionalität implementiert mit warn_unused_result
:
int f() __attribute__ ((warn_unused_result));
int f() {
return 1;
}
int main() {
f();
}
was gibt:
main.cpp: In function ‘int main()’:
main.cpp:8:6: warning: ignoring return value of ‘int f()’, declared with attribute warn_unused_result [-Wunused-result]
8 | f();
| ~^~
Es sollte dann darauf hingewiesen, dass seit ANSI C keinen Standard hat für diesen, ANSI C nicht angibt , welche C - Standardbibliothek Funktionen das Attribut haben oder nicht , und deshalb haben Implementierungen ihre eigenen Entscheidungen darüber , was sollte oder nicht markiert werden warn_unuesd_result
, die Aus diesem Grund müssten Sie im Allgemeinen die (void)
Umwandlung verwenden, um Rückgaben von Aufrufen von Standardbibliotheksfunktionen zu ignorieren und Warnungen in jeder Implementierung vollständig zu vermeiden.
Getestet in GCC 9.2.1, Ubuntu 19.10.