【问题标题】:Unreachable code warning in warning Level 4警告级别 4 中的无法访问代码警告
【发布时间】:2015-05-22 04:31:15
【问题描述】:

有人能解释一下为什么这会给*a=9; 行提供无法访问的代码警告吗? 我正在使用 VS2015 预览和警告级别 4

int main(){
int* a = foo();
try{
 *a = 5;
}catch(int)
{
 *a=9;
}
  return 0;
}

【问题讨论】:

  • *a = 5; 怎么会抛出 catch(int) 可以处理的东西?
  • @ghs.at: 那么如果我在*a=5; 行之后添加foo(); 行,警告就会消失。这是怎么发生的?
  • @NayanaAdassuriya 这意味着 foo() 可能会抛出异常。
  • @harper foo 对这个例子做了什么并不重要
  • int a* = 是什么意思?你的意思是int *a =

标签: c++


【解决方案1】:

这会为 *a=9 提供无法访问的代码警告,因为您的编译器知道 try 块中的代码永远不会抛出任何类型的异常。所以你的 catch 块永远不会执行。

当代码容易抛出异常时使用 try/catch。

【讨论】:

  • @NayanaAdassuriya 然后该行会导致未定义的行为。一旦未定义的行为被打开,它就永远不能放回瓶子里;编译器不必计划任何合理的事情,例如捕获异常。
  • @NayanaAdassuriya 它不会抛出异常。它会导致未定义的行为。
  • @harper Hans 并没有这么说。请仔细阅读最后三段。
【解决方案2】:

它无法访问的原因是因为您的代码片段 *a = 5 不能引发异常。它可能会导致访问冲突(例如,如果 foo 返回 nullptr),但不会作为 C++ 异常处理。

如果这是你想要的,你可以使用 __try/__except 捕获访问冲突,但我认为你应该只在特殊情况下使用它。

https://msdn.microsoft.com/en-us/library/s58ftw19%28v=vs.80%29.aspx?f=255&MSPPError=-2147217396

【讨论】:

  • 可以作为 C++ 异常处理。这是未定义的行为,当 UB 发生时,任何事情都可能发生,包括抛出异常然后正常进行。 (是的,有编译器可以这样做)
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 2016-04-04
  • 2021-02-28
  • 1970-01-01
  • 2013-01-16
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多