在查看GCC's warning options时,我遇到了 -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:warning:函数返回一个聚合[-Waggregate-return]
另一个没有引发警告的小例子:
#include <string>
std::string f(void){return "test";}
int main(){}
使用-Waggregate-return会带来什么好处?
为什么有人想要对此发出警告?
另外,std :: string不是一个类吗? - 为什么我没有在第二个例子中警告'返回聚合'?
答案 0 :(得分:6)
根据@AlokSave的评论,以后是对答案的编辑:
对于此编译器标志,有三种可能的解释。由于关于它的文档很少,有些不清楚其原始含义是什么,但主要有两种可能的解释:
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编译器的向后兼容性 不允许返回结构。那些编译器 已经死了,不再是实际问题了。
答案 1 :(得分:4)
聚合在C和C ++标准中定义。 C版说(C99 6.2.5类型/ 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中返回聚合被认为是不好的风格;传递一个out指针是该语言的首选。我不认为它同样适用于C ++。但我无法用任何数据证实这一点。