如何忽略以下编译器警告?

Seb*_*bGR 0 c++ g++

在编译下面的代码片段(g ++ 4.6)时,我得到(预期的)警告消息: ./test.cpp:3:7: attention : address of local variable ‘ii’ returned [enabled by default].

int *get_ii()  
{  
  int ii = 2;
  return ⅈ
}

int main(int argc, char* argv[])
{
  int *ii;
  ii = get_ii();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题:是否有编译器选项允许我在编译时忽略此警告消息?

理由:这纯粹是出于教学目的.我想向观众展示这段代码并询问它有什么问题.这就是我想隐藏警告信息的原因,因为这是一个很大的线索.

Luc*_*ore 10

在gcc中没有办法(pragma warning在MSVS中),这是一个你不应该忽略的警告.

将函数local的地址返回给函数是未定义的行为.当get_ii返回时,变量ii不再存在,但你返回一个指针.如果你把它改成了

int *get_ii()  
{  
  static int ii = 2;
  return ⅈ
}
Run Code Online (Sandbox Code Playgroud)

它会解决问题和警告.

  • @AndreasBrinck:我不能很快找到它,但记得很多年前关于这个话题的讨论,主要是为什么这应该(或不应该)是UB.有人提出了一个带有标记指针的(不幸的是不是假设的)架构,即使将指针复制到未映射的内存中也会陷阱.我猜这也与最近推出的"odr-used"一词有关. (2认同)