errno — странное поведение области видимости переменной в переполнении стека

Моя программа вызывает методы, которые будут устанавливать errno когда происходит сбой, я бросаю errno как исключение и поймать его:

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

Здесь я не хочу обсуждать тему лучшей практики обработки исключений. Правда в коде выше, 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). Кто-нибудь может объяснить странное поведение?

2

Решение

errno это макрос. Таким образом, ваш обработчик исключений содержит несколько расширенных токенов, которые, скорее всего, имеют мало смысла. Из стандартного ([ERRNO]):

Содержимое заголовка совпадает с заголовком POSIX
за исключением того, что errno должен быть определен как макрос.

8

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector