关于-Waggregate-return的目的/行为的困惑?

时间:2012-12-24 04:14:31

标签: c++ gcc g++ warnings gcc-warning

在查看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不是一个类吗? - 为什么我没有在第二个例子中警告'返回聚合'?

2 个答案:

答案 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 ++。但我无法用任何数据证实这一点。