Большинство компиляторов С++ позволяют исключать исключения. Есть ли способ определить его из кода без использования макросов препроцессора, специфичных для компилятора, таких как _CPPUNWIND для MSVC? Идеально во время компиляции.
Программно определить, разрешены ли исключения
Ответ 1
Поскольку WG21 в 2014 году, рекомендуется использовать макрос
__cpp_exceptions
Он будет иметь значение 199711, если исключения поддерживаются, а компилятор соответствует С++ 98. Другие похожие макросы функций показаны здесь.
Ответ 2
Нет. Исключения являются частью С++. Тот факт, что некоторые компиляторы позволяют вам отключить их, совершенно не имеет значения, и стандарт не будет предусматривать, чтобы вы определяли, включены ли они - насколько это касается, они всегда включены. Если вы хотите знать о конкретном поведении, единственный способ пойти, это спросить об этом.
Ответ 3
Я бы не стал обременять это время. Вместо этого я бы построил две библиотеки:
libfoo.a
libfoo_exc.a
Тогда у меня будет мой configure
script определить, есть ли у нас исключения, и установите Makefile следующим образом:
ifeq($HAVE_EXCEPTIONS, 1)
foolib=foo_exc
else
foolib=foo
endif
libs=$(libs) -l$(foolib)
$(TARGET): $(OBJECTS)
$(CXX) -o $(TARGET) $(OBJECTS) $(LDFLAGS) $(LIBS)
Чтобы определить, есть ли у вас исключения, вы можете просто попытаться создать крошечную тестовую программу с тривиальным блоком try/catch, как это предлагается в комментариях.
Чтобы создать свою библиотеку, просто напишите условный код:
#if HAVE_EXCEPTIONS > 0
/* ... */
#else
/* ... */
#endif
И затем создайте две библиотеки, одну с -DHAVE_EXCEPTIONS=0
и одну с -DHAVE_EXCEPTIONS=1
или что-то в этом роде.
Таким образом, у вас нет служебных ресурсов во время выполнения, и ваши клиенты могут использовать любую библиотеку, которую они предпочитают.