Я использовал #ifdef Win32
для безопасных вызовов, sprintf_s
как sprintf_s
но теперь я хочу построить проект с помощью MinGW, и теперь это просто неправильно. Мне нужно использовать #ifdef VC++
или как-то так. Является ли это возможным?
См. Таблицу «Определенные предопределенные macros Microsoft» для предопределенных макросов Visual C
Вы можете проверить _MSC_VER
.
#ifdef __GNUC__ /*code for GNU C compiler */ #elif _MSC_VER /*usually has the version number in _MSC_VER*/ /*code specific to MSVC compiler*/ #elif __BORLANDC__ /*code specific to borland compilers*/ #elif __MINGW32__ /*code specific to mingw compilers*/ #endif
Предпочтительно, вы должны прибегать к использованию переносных символов. Я понимаю, что иногда эти символы не могут быть определены, поэтому вы можете увидеть проект Predef для обширного списка макросов препроцессора в отношении стандартов, компиляторов, библиотек, операционных систем и архитектур, которые не являются переносимыми.
Однако функция, которую вы конкретно упомянули в этом вопросе, была включена в стандарт C11 в качестве части Приложения K.3, интерфейсов проверки границ (библиотека) .
K.3.1.1p2 гласит:
Функции, macros и типы, объявленные или определенные в K.3 и его подclassах, объявляются и определяются их соответствующими заголовками, если
__STDC_WANT_LIB_EXT1__
определяется как макрос, который расширяется до целочисленной константы 1 в точке исходного файла, где соответствующий заголовок впервые включен
Таким образом, вы должны поместить предпочтение при проверке __STDC_WANT_LIB_EXT1__
и использовать только символы, относящиеся к компилятору, когда этого не существует.