Tre*_*key 9 c++ gcc warnings g++ gcc-warning
在看GCC的警告选项时,我遇到了-Waggregate-return.
-Waggregate-return
如果定义或调用任何返回结构或联合的函数,则发出警告.(在可以返回数组的语言中,这也会引发警告.)
引发警告的小例子:
class foo{};
foo f(void){return foo{};}
int main(){}
Run Code Online (Sandbox Code Playgroud)
$ g ++ -std = c ++ 0x -Waggregate-return -o main main.cpp
main.cpp:在函数'foo f()'中:
main.cpp:2:5:warning:函数返回一个聚合[-Waggregate-返回]
另一个不引发警告的小例子:
#include <string>
std::string f(void){return "test";}
int main(){}
Run Code Online (Sandbox Code Playgroud)
使用-Waggregate-return可以获得什么好处?
为什么有人想要对此发出警告?
另外,std :: string不是一个类吗? - 为什么我不警告第二个例子中的'返回聚合'?
根据@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编译器.那些编译器早已死亡,不再是实际问题.
聚合在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 ++。但是我无法用任何数据确认这一点。
| 归档时间: |
|
| 查看次数: |
3872 次 |
| 最近记录: |