Моя программа вызывает методы, которые будут устанавливать 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). Кто-нибудь может объяснить странное поведение?
errno
это макрос. Таким образом, ваш обработчик исключений содержит несколько расширенных токенов, которые, скорее всего, имеют мало смысла. Из стандартного ([ERRNO]):
Содержимое заголовка совпадает с заголовком POSIX
за исключением того, что errno должен быть определен как макрос.
Других решений пока нет …