Während Blick auf die GCC Warnung Optionen , stieß ich auf -Weggregate-return .
-Weggregate-return
Warnen, wenn Funktionen definiert oder aufgerufen werden, die Strukturen oder Vereinigungen zurückgeben. (In Sprachen, in denen Sie ein Array zurückgeben können, löst dies ebenfalls eine Warnung aus.)
kleines Beispiel, das die Warnung auslöst:
%Vor%$ g ++ -std = c ++ 0x -Weggregate-return -o Hauptmain.cpp
zurück
main.cpp: In der Funktion 'foo f ()':
main.cpp: 2: 5: warning: function gibt ein Aggregat [-Weggregate-return]
ein weiteres kleines Beispiel, das die Warnung nicht auslöst:
%Vor% Welchen Nutzen hat die Verwendung von -Weggregate-Rückgabe?
Warum sollte jemand davor gewarnt werden?
Ist auch nicht std :: string eine Klasse? - Warum warnte ich nicht vor dem 'zurückgegebenen Aggregat' im zweiten Beispiel?
Nach den Kommentaren von @AlokSave folgt hier eine spätere Bearbeitung der Antwort:
Drei sind zwei mögliche Erklärungen für dieses Compiler-Flag. Da die Dokumentation darüber knapp ist, ist es etwas unklar, was ihre ursprüngliche Bedeutung ist, aber es gibt hauptsächlich zwei mögliche Erklärungen:
1) Warnung, dass der Benutzer beim Zurückgeben eines Aggregatobjekts darauf aufmerksam macht, dass der Stapel überlaufen könnte, wenn das Aggregatobjekt (das auf dem Stapel zugeordnet ist) zurückgegeben wird.
2) Offenbar hat ein alter C-Compiler das Zurückgeben von Aggregaten nicht unterstützt (Sie mussten einen Zeiger zurückgeben).
Welche der beiden die beste ist, ist schwer zu beurteilen. Weitere relevante Informationen zu diesem Flag finden Sie unter den folgenden Links:
Zitat aus dem letzten Link:
In den GNU-Apps, die ich kenne (Emacs, Coreutils, ...) Wir deaktivieren einfach -Weggregate-Return. Es ist komplett anachronistische Warnung, da seine Motivation war Abwärtskompatibilität mit C-Compilern unterstützen erlaubte zurückkehrende Strukturen nicht. Diese Compiler sind schon lange tot und haben keine praktische Sorge mehr.
Aggregate sind in den C- und C ++ - Standards definiert. Die C-Version sagt (C99 6.2.5 Typen / 20-21):
Ein Strukturtyp beschreibt einen sequentiell zugeordneten nicht leeren Satz von Mitgliedsobjekten (und unter bestimmten Umständen eine unvollständige Anordnung), von denen jede eine Option hat angegebener Name und möglicherweise unterschiedlicher Typ.
[...]
Arithmetische Typen und Zeigertypen werden zusammen als Skalartypen bezeichnet. Array und Strukturtypen werden zusammen als Aggregattypen bezeichnet.
Die C ++ Version sagt (N3485 8.5.1 [dcl.init.aggr] / 1):
ein Aggregat ist, ein Array oder eine Klasse (Abschnitt 9) ohne Benutzer bereitgestellten Konstruktoren (12.1), ohne Verstrebung-oder-gleich-Initialisierer für nicht-statische Datenelemente (9.2), keine privaten oder geschützten nicht-statischen Datenelemente (Abschnitt 11), keine Basisklassen (Abschnitt 10) und keine virtuellen Funktionen (10.3).
Ihr zweites Beispiel (mit std::string
) löst die Warnung nicht aus, weil std::string
einen vom Benutzer bereitgestellten Konstruktor hat; und hat private Datenmitglieder.
Es ist mein Verdacht, dass diese Warnung existiert, weil es als schlechter Stil gilt, ein Aggregat in C zurückzugeben; das Übergeben eines Aus-Zeigers wird stattdessen in dieser Sprache bevorzugt. Ich denke nicht, dass es für C ++ so gilt. Aber ich kann das mit keinen Daten bestätigen.
Tags und Links c++ gcc g++ gcc-warning warnings