У меня есть общий вопрос C++/Windows по стандартам кодирования, касающимся утверждений времени компиляции.
static_assert
поддерживается ли C++11 и язык/компилятор;C_ASSERT
— это определение от winnt.h
Итак, если у меня есть код Windows на C++, какой из них мне использовать? Почему? Каковы преимущества одного перед другим?
Я проверил оба - есть разница в сообщении об ошибке.
Особенно, если использование непереносимого кода вам ничего не даст.
Имейте в виду, что API Win32 должен поддерживать как C, так и C++, новый и старый, поэтому он использует множество абстракций, которые позволяют ему делать разные вещи в разных конфигурациях для поддержания согласованного интерфейса. Если вы ориентируетесь только на C++, особенно на C++11 или новее, тогда просто нет смысла использовать C_ASSERT
вместо static_assert
. static_assert
— это стандарт C++. C_ASSERT
— изобретение Microsoft.
Что касается переносимости, вам также следует спросить, нужно ли переносить код на старые цепочки инструментов. Т.е. если его, скорее всего, придется создавать в более старой визуальной студии, которая не поддерживает его на этом языке, чем на платформе, отличной от Windows.
@RemyLebeau И даже в C, начиная с C11, он также имеет static_assert
(когда <assert.h>
включен).
Если вы не нацелены на платформу/компилятор/... у которой нет static_assert
, я не вижу смысла не использовать стандартный способ.
Согласно документации, вам следует использовать static_assert вместо C_ASSERT.
Очень исчерпывающий ответ! Спасибо!
В общем, переносимый код предпочтительнее кода, специфичного для реализации.