C ++中的变量范围奇怪行为

时间:2017-12-14 08:21:25

标签: c++ errno

我的程序调用在发生故障时设置errno的方法,我抛出errno就像异常一样抓住它:

try
{
    if (-1 == truncate("/foo/bar.txt", 0))
    {
        throw errno;
    }
}
catch (const int errno)
{
    //log
}

这里我不想讨论异常处理最佳实践主题。事实是在上面的代码中,当catch括号中的变量名是catch时,errno块不会被命中。此问题可简化为:

try
{
    throw 1999;
}
catch (const int errno)  //renaming "errno" to "e" works!!!
{
    //unreachable code here 
}

我知道errno是一个“特殊”名称,但我认为C ++可以正确处理在不同范围内定义的相同变量名。

//test.h
int my_number = 99;

//test.cpp
#include "test.h"
int main()
{
    try
    {
        throw 1999;
    }
    catch(int my_number)
    {
        std::cout << "in catch: " << my_number << std::endl;   //prints 1999
    }

    std::cout << my_number << std::endl;  //prints 99
}

该程序是在GNU5.4中编译的(在C ++ 11和C ++ 14中都有)。任何人都可以解释这种奇怪的行为吗?

1 个答案:

答案 0 :(得分:8)

errno是一个宏。因此,您的异常处理程序包含一些扩展的标记,这些标记很可能没什么意义。从标准([errno]):

  

标题的内容与POSIX标题相同   ,除了将errno定义为宏。