Ошибка: «uncaught_exceptions» недоступно: введено в macOS 10.12 - PullRequest
0 голосов
/ 12 ноября 2018

Я проверяю проблему, возникшую недавно во время тестирования под C ++ 17. Вот исходный файл:

$ cat test.cxx
#if __EXCEPTIONS && __has_feature(cxx_exceptions)
# include <exception>
# define CXX17_EXCEPTIONS 1
#endif

void Foo()
{
#if defined(CXX17_EXCEPTIONS)
    if (std::uncaught_exceptions() == 0)
#endif
    {
        int x = 0;
    }
}

И его компиляция с использованием компилятора Macports на OS X 10.8 или 10.9:

$ /opt/local/bin/clang++-mp-5.0 -std=gnu++17 test.cxx -c
test.cxx:9:14: error: 'uncaught_exceptions' is unavailable: introduced in macOS 10.12
    if (std::uncaught_exceptions() == 0)
             ^
/opt/local/libexec/llvm-5.0/include/c++/v1/exception:130:63: note:
      'uncaught_exceptions' has been explicitly marked unavailable here
_LIBCPP_FUNC_VIS _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS int uncaught_e...
                                                              ^
1 error generated.

/opt/local/bin/clang++-mp-5.0 также испытывает проблему. Похоже, это не разовая проблема. 4.0 отклоняет -std=gnu++17, поэтому я не могу тестировать дальше.

Согласно примечаниям к выпуску Clang 3.6 , я полагаю, что использую правильный тест для std::uncaught_exceptions():

Чтобы надежно проверить, включены ли исключения C ++, используйте __EXCEPTIONS && __has_feature (cxx_exceptions), иначе все не будет работать во всех версиях Clang в файлах Objective-C ++.

Я, вероятно, не смогу включить специфичный для Apple заголовочный файл, поэтому я не смогу протестировать для OS X 10.12. Другие столкнулись с проблемой, но я не нашел правильного решения. Например, этот отчет об ошибке имеет ту же нерешенную проблему.

Есть ли способ обойти эту проблему на платформах Apple, которая включает стандартные макросы препроцессора C ++ и тестирование функций? Если да, то какой метод или тесты?


$ /opt/local/bin/clang++-mp-6.0 --version
clang version 6.0.1 (tags/RELEASE_601/final)
Target: x86_64-apple-darwin13.4.0
Thread model: posix
InstalledDir: /opt/local/libexec/llvm-6.0/bin

$ /opt/local/bin/clang++-mp-5.0 --version
clang version 5.0.2 (tags/RELEASE_502/final)
Target: x86_64-apple-darwin13.4.0
Thread model: posix
InstalledDir: /opt/local/libexec/llvm-5.0/bin

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Проблема в том, что библиотека времени выполнения (libc++.dylib), поставляемая в Mac OS до 10.12, не содержит определения для std::uncaught_exceptions(). Если вы попытаетесь использовать его на этих платформах, это приведет к ошибке компоновщика. Поэтому вместо этого мы предупреждаем вас во время компиляции, что это не получится. Это не имеет ничего общего с доступными / недоступными исключениями: речь идет о недоступности определенной функции.

0 голосов
/ 15 ноября 2018

__EXCEPTIONS && __has_feature(cxx_exceptions) проверяет наличие исключений. Исключения - это языковая функция, которая появилась в C ++ примерно с 1990 года (они не были представлены в C ++ 17!), Поэтому, если вы явно не отключите исключения, они всегда должны быть доступны.

__cpp_lib_uncaught_exceptions является правильным тестом.

0 голосов
/ 12 ноября 2018

Я не уверен, что это правильный способ справиться с ситуацией, но это может помочь другим.

$ cat test.cxx
#if __EXCEPTIONS && __has_feature(cxx_exceptions)
# if __cpp_lib_uncaught_exceptions
#  include <exception>
#  define CXX17_EXCEPTIONS 1
# endif
#endif

void Foo()
{
#if defined(CXX17_EXCEPTIONS)
    if (std::uncaught_exceptions() == 0)
#endif
    {
        int x = 0;
    }
}

__EXCEPTIONS && __has_feature(cxx_exceptions) относится к Clang и определяет, доступны ли исключения C ++ 17 (включая ObjectiveC ++). __cpp_lib_uncaught_exceptions является функцией языка C ++ и определяет, доступны ли исключения C ++ 17.

Мне не ясно, как __has_feature(cxx_exceptions) возвращает true, когда исключения C ++ 17 недоступны. Кажется очевидным (для меня), что функция недоступна.

Также см. LLVM Issue 39631, __has_feature(cxx_exceptions) возвращает true, но не компилируется std::uncaught_exceptions().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...