Подтвердить что ты не робот

Программно определить, разрешены ли исключения

Большинство компиляторов С++ позволяют исключать исключения. Есть ли способ определить его из кода без использования макросов препроцессора, специфичных для компилятора, таких как _CPPUNWIND для MSVC? Идеально во время компиляции.

4b9b3361

Ответ 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 или что-то в этом роде.

Таким образом, у вас нет служебных ресурсов во время выполнения, и ваши клиенты могут использовать любую библиотеку, которую они предпочитают.