10

GCC の警告オプションを見ているときに、-Waggregate-returnに出会いました。

-Waggregate-return
構造体または共用体を返す関数が定義または呼び出された場合に警告します。(配列を返すことができる言語では、これも警告を引き出します。)


警告を引き出す小さな例:

class foo{};
foo f(void){return foo{};}
int main(){}

$ g++ -std=c++0x -Waggregate-return -o main main.cpp
main.cpp: In function 'foo f()':
main.cpp:2:5: warning: function returns an aggregate [-Waggregate-戻る]


警告を出さない別の小さな例:

#include <string>
std::string f(void){return "test";}
int main(){}

-Waggregate-return を使用することで得られるメリットは何ですか?
なぜ誰かがこれについて警告されたいのですか?
また、std::string はクラスではありませんか?- 2 番目の例で「返された集計」について警告しなかったのはなぜですか?

4

2 に答える 2

9

@AlokSaveによるコメントに続いて、回答を後で編集します。

このコンパイラフラグの2つの考えられる説明は3つです。それに関する文書が不足しているため、その本来の意味が何であるかはやや不明確ですが、主に2つの考えられる説明があります。

1)集約オブジェクトを返すことについてユーザーに警告すると、(スタックに割り当てられている)集約オブジェクトが返された場合にスタックがオーバーフローする可能性があることをユーザーに知らせます。

2)どうやら、いくつかの古いCコンパイラはaggrregatesを返すことをサポートしていませんでした(ポインタを返す必要がありました)。

どちらが一番いいのか、判断が難しいです。ただし、このフラグに関するより関連性の高い情報は、次のリンクにあります。

http://bytes.com/topic/c/answers/644271-aggregate-return-warnings

https://lists.gnu.org/archive/html/bug-gnulib/2012-09/msg00006.html

後者のリンクからの引用:

私がよく知っているGNUアプリ(Emacs、coreutils、...)では、-Waggregate-returnを無効にするだけです。その動機は、構造体を返すことを許可しないCコンパイラとの下位互換性をサポートすることであったため、これは完全に時代錯誤的な警告です。これらのコンパイラは長い間使用されておらず、実用上の問題はありません。

于 2012-12-24T04:23:36.667 に答える
5

集計は、CおよびC++標準で定義されています。Cバージョンには(C996.2.5タイプ/20-21)と書かれています:

構造体タイプは、順次割り当てられる空でないメンバーオブジェクトのセット(および、特定の状況では、不完全な配列)を記述します。各オブジェクトには、オプションで指定された名前と、場合によっては個別のタイプがあります。

[...]

算術型とポインタ型はまとめてスカラー型と呼ばれます。配列タイプと構造タイプは、まとめて集約タイプと呼ばれます。

C ++バージョンによると(N3485 8.5.1 [dcl.init.aggr] / 1):

アグリゲートは、ユーザー提供のコンストラクター(12.1)、非静的データメンバー用のブレースまたはイコールイニシャライザー(9.2)、プライベートまたは保護された非静的データメンバー(条項11)、基本クラスなし(条項10)、および仮想関数なし(10.3)。

2番目の例(with )は、ユーザー提供のコンストラクターがあるstd::stringため、警告をトリガーしません。std::stringプライベートデータメンバーがいます。

Cで集計を返すのはスタイルが悪いと考えられているため、この警告が存在するのではないかと疑っています。その言語では、代わりに出力ポインタを渡すことをお勧めします。C++にはあまり当てはまらないと思います。しかし、これはどのデータでも確認できません。

于 2012-12-24T04:22:21.967 に答える