 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jan Schmidt Guest
|
Posted: Thu Jun 16, 2005 6:48 am Post subject: warning: function returns an aggregate |
|
|
Hallo,
ich habe folgendes kleines Programm.
#include <string>
#include <iostream>
using namespace std;
class test
{
public:
test (){}
string do_it (const string a)
{
return a + "huhu";
}
};
int main (int argc, char **argv)
{
test tmp;
cout << tmp.do_it ("hallo ") << endl;
}
Wenn ich das kompiliere mit
g++ -o test test.cpp -Wall -W -Wundef -Wshadow -Wpointer-arith
-Wcast-qual -Wcast-align -Wwrite-strings
-Wsign-compare -Wredundant-decls -Waggregate-return
-Wmissing-prototypes
bekomme ich eine Reihe von Warnungen, u.a.
test.cpp:62: warning: function returns an aggregate
und
test.cpp:72: warning: function call has aggregate value
Ich verwende den Compiler
g++ --version
g++ (GCC) 3.3.4 (pre 3.3.5 20040809)
Beide Warnungen sind mir vorher (gcc 2.x) nie begegnet - auch der
vc6.0 erzeugt sie nicht. Was bedeuten die Warnungen und wie kann ich
sie verhindern (außer Warnung ausschalten)?
Danke,
jan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Thu Jun 16, 2005 9:19 am Post subject: Re: warning: function returns an aggregate |
|
|
Jan Schmidt wrote:
| Quote: | g++ -o test test.cpp -Wall -W -Wundef -Wshadow -Wpointer-arith
-Wcast-qual -Wcast-align -Wwrite-strings
-Wsign-compare -Wredundant-decls -Waggregate-return
^^^^^^^^^^^^^^^^^
-Wmissing-prototypes
bekomme ich eine Reihe von Warnungen, u.a.
test.cpp:62: warning: function returns an aggregate
und
test.cpp:72: warning: function call has aggregate value
Ich verwende den Compiler
g++ --version
g++ (GCC) 3.3.4 (pre 3.3.5 20040809)
Beide Warnungen sind mir vorher (gcc 2.x) nie begegnet - auch der
vc6.0 erzeugt sie nicht. Was bedeuten die Warnungen und wie kann ich
sie verhindern (außer Warnung ausschalten)?
|
Wieso schaltest du diese Warnungen explizit ein, wenn du nicht weißt, was
sie bedeuten? Und warum schaust du nicht ins Manual des Compilers?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Jan Schmidt Guest
|
Posted: Thu Jun 16, 2005 10:20 am Post subject: Re: warning: function returns an aggregate |
|
|
Rolf Magnus <ramagnus (AT) t-online (DOT) de> writes:
| Quote: | Jan Schmidt wrote:
g++ -o test test.cpp -Wall -W -Wundef -Wshadow -Wpointer-arith
-Wcast-qual -Wcast-align -Wwrite-strings
-Wsign-compare -Wredundant-decls -Waggregate-return
^^^^^^^^^^^^^^^^^
-Wmissing-prototypes
bekomme ich eine Reihe von Warnungen, u.a.
test.cpp:62: warning: function returns an aggregate
Wieso schaltest du diese Warnungen explizit ein, wenn du nicht
weißt, was sie bedeuten? Und warum schaust du nicht ins Manual
des Compilers?
|
Wann die Warnung kommt, weiß ich schon - mich hat halt nur
interessiert, was den Compiler an dem Code stört, bzw. wie man das
umschreiben muß, damit die Warnung nicht mehr kommt.
Die einfachte Variante mit weglassen von -Waggregate-return wollte ich
halt nicht gelten lassen. (Das beste ist halt, so zu coden, daß die
Compiler nichts mehr zu warnen haben...)
gruß,
jan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Thu Jun 16, 2005 12:33 pm Post subject: Re: warning: function returns an aggregate |
|
|
Jan Schmidt wrote:
| Quote: | Rolf Magnus <ramagnus (AT) t-online (DOT) de> writes:
Jan Schmidt wrote:
g++ -o test test.cpp -Wall -W -Wundef -Wshadow -Wpointer-arith
-Wcast-qual -Wcast-align -Wwrite-strings
-Wsign-compare -Wredundant-decls -Waggregate-return
^^^^^^^^^^^^^^^^^
-Wmissing-prototypes
bekomme ich eine Reihe von Warnungen, u.a.
test.cpp:62: warning: function returns an aggregate
Wieso schaltest du diese Warnungen explizit ein, wenn du nicht
weißt, was sie bedeuten? Und warum schaust du nicht ins Manual
des Compilers?
Wann die Warnung kommt, weiß ich schon - mich hat halt nur interessiert,
was den Compiler an dem Code stört, bzw. wie man das umschreiben muß,
damit die Warnung nicht mehr kommt.
|
Nun, wie schon das Manual sagt:
-Waggregate-return
Warn if any functions that return structures or unions are defined or
called. (In languages where you can return an array, this also elicits a
warning.)
Deine Funktion do_it hat als Rückgabetyp eine Instanz einer Klasse (nämlich
std::string), die ein "aggregate" ist (Klassen sind im Prinzip das gleiche
wie struct). Es wird also genau wie im Manual beschrieben eine Warnung für
die Definition der Funktion und eine für deren Aufruf generiert. Was
erscheint dir daran unlogisch?
Wenn du die Warnung vermeiden willst, ohne sie auszuschalten, muß du also
auf die Rückgabe von Instanzen von Klassen aus Funktionen generell
verzichten. Wie sinnvoll das ist, mußt du selbst entscheiden. Immerhin bist
du ja auch selbst derjenige, der die Warnung unbedingt haben will.
| Quote: | Die einfachte Variante mit weglassen von -Waggregate-return wollte ich
halt nicht gelten lassen. (Das beste ist halt, so zu coden, daß die
Compiler nichts mehr zu warnen haben...)
|
Das heißt aber nicht, daß man selbst wahlfrei irgendwelche zusätzlichen
Warnungen akitivieren sollte, deren Bedeutung einem nicht klar ist.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Thu Jun 16, 2005 1:03 pm Post subject: Re: warning: function returns an aggregate |
|
|
Jan Schmidt wrote:
[snip]
| Quote: | Die einfachte Variante mit weglassen von -Waggregate-return wollte ich
halt nicht gelten lassen. (Das beste ist halt, so zu coden, daß die
Compiler nichts mehr zu warnen haben...)
|
Seltsam:
Du befiehlst dem Compiler dass er dich warnen soll, wenn du ein
Aggregat (also ein struct, class oder union) aus einer Funktion
zurueckgibst und wenn der Compiler dann tut was du ihm befiehlst,
passt es dir auch nicht.
Patient: "Doktor, wenn ich das mache, tut's weh.?"
Doktor: "Dann machen sie's halt nicht!"
Du hast 2 Moeglichkeiten:
* Entweder du gibst nie ein Aggregat als Returnwert zurueck (Das wird
sich aber in einem echten Program so gut wie gar nicht durchziehen lassen)
* oder Du schaltest diese Warnung ab.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Heinz Saathoff Guest
|
Posted: Thu Jun 16, 2005 3:50 pm Post subject: Re: warning: function returns an aggregate |
|
|
Moin,
Jan Schmidt schrieb...
| Quote: | [snip]
test.cpp:62: warning: function returns an aggregate
und
test.cpp:72: warning: function call has aggregate value
Ich verwende den Compiler
g++ --version
g++ (GCC) 3.3.4 (pre 3.3.5 20040809)
Beide Warnungen sind mir vorher (gcc 2.x) nie begegnet - auch der
vc6.0 erzeugt sie nicht. Was bedeuten die Warnungen und wie kann ich
sie verhindern (außer Warnung ausschalten)?
|
Wie die anderen schon schrieben, hast Du die Warnung ja explizit
angefordert. Nun noch zur Frage, warum eine Warnung gegeben werden
sollte: Übergabe und Rückgabe von Aggregaten kann die Effizienz
beeinträchtigen, besonders wenn die Aggregate sehr groß sind oder
aufwändigen Kopierkonstruktor besitzen. Wenn man also statt 'by value'
die Übergabe/Rückgabe 'by reference' oder (nicht so gut) 'by pointer'
macht, kann das resultierende Programm schneller werden.
- Heinz
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Jan Schmidt Guest
|
Posted: Tue Jun 21, 2005 7:02 am Post subject: Re: warning: function returns an aggregate |
|
|
Heinz Saathoff <hsaat (AT) despammed (DOT) com> writes:
| Quote: | Moin,
Jan Schmidt schrieb...
[snip]
test.cpp:62: warning: function returns an aggregate
und
test.cpp:72: warning: function call has aggregate value
Ich verwende den Compiler
g++ --version
g++ (GCC) 3.3.4 (pre 3.3.5 20040809)
Beide Warnungen sind mir vorher (gcc 2.x) nie begegnet - auch der
vc6.0 erzeugt sie nicht. Was bedeuten die Warnungen und wie kann ich
sie verhindern (außer Warnung ausschalten)?
Wie die anderen schon schrieben, hast Du die Warnung ja explizit
angefordert. Nun noch zur Frage, warum eine Warnung gegeben werden
sollte: Übergabe und Rückgabe von Aggregaten kann die Effizienz
beeinträchtigen, besonders wenn die Aggregate sehr groß sind oder
aufwändigen Kopierkonstruktor besitzen. Wenn man also statt 'by value'
die Übergabe/Rückgabe 'by reference' oder (nicht so gut) 'by pointer'
macht, kann das resultierende Programm schneller werden.
|
ja, ok. genau darauf wollte ich hinaus - danke!
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|