在查看GCC 的警告选项时,我遇到了-Waggregate-return。
-Waggregate-返回
如果定义或调用任何返回结构或联合的函数,则发出警告。 (在可以返回数组的语言中,这也会引发警告。)
引起警告的小例子:
class foo{};
foo f(void){return foo{};}
int main(){}
$ g++ -std=c++0x -Waggregate-return -o main main.cpp
main.cpp:在函数‘foo f()’中:
main.cpp:2:5:警告:函数返回一个聚合 [-Waggregate-return]
另一个不会引发警告的小例子:
#include <string>
std::string f(void){return "test";}
int main(){}
使用-Waggregate-return有什么好处?
为什么有人想要收到有关此的警告?
另外, std::string 不是一个类吗?-为什么我没有在第二个示例中警告“返回的聚合”?
根据@AlokSave 的评论,以下是答案的后续编辑:
由于有关此编译器标志的文档很少,因此有些不清楚其原始含义是什么,但主要有两种可能的解释:
警告用户返回聚合对象,让他们意识到如果返回聚合对象(在堆栈上分配),堆栈可能会溢出。
显然,一些旧的 C 编译器不支持返回聚合(您必须返回指针)。
两者哪个最好,我很难判断。但是,有关此标志的更多相关信息可以在以下链接中找到:
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 编译器的向后兼容性 不允许返回结构。 那些编译器 早已去世,不再具有实际意义。
聚合在 C 和 C++ 标准中定义。 C 版本说(C99 6.2.5 Types/20-21):
结构类型描述了按顺序分配的非空成员对象集 (并且,在某些情况下,是一个不完整的数组),每个数组都有一个可选的 指定的名称和可能不同的类型。
[...]
算术类型和指针类型统称为标量类型。数组和 结构类型统称为聚合类型。
C++ 版本显示 (N3485 8.5.1 [dcl.init.aggr]/1):
聚合是一个数组或类(第 9 条),没有用户提供的构造函数(12.1),没有非静态数据成员的大括号或等于初始化器(9.2),没有私有或受保护的非静态数据成员(第 11 条),没有基类(第 10 条),也没有虚函数(10.3)。
您的第二个示例(使用
std::string
)不会触发警告,因为 std::string
有一个用户提供的构造函数;并拥有私有数据成员。
我怀疑这个警告存在,因为在 C 中返回聚合被认为是糟糕的风格;在该语言中,首选传递输出指针。我认为它不太适用于 C++。但我无法用任何数据证实这一点。