Verwirrung in Bezug auf Zweck / Verhalten von -Weggregate-Return?

8

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
  main.cpp: In der Funktion 'foo f ()':
  main.cpp: 2: 5: warning: function gibt ein Aggregat [-Weggregate-return]

zurück

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?

    
Trevor Hickey 24.12.2012, 04:14
quelle

2 Antworten

5

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.

      
    
  
    
user1284631 24.12.2012, 04:23
quelle
4

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.

    
Billy ONeal 24.12.2012 04:22
quelle

Tags und Links