"Строковые безопасные функции" и gcc
Я использую CodeBlocks и компилятор GCC. Я хотел бы использовать "функции безопасной строки", например strlen_s
, strcpy_s
, но компилятор показывает ошибку:
Неопределенная ссылка на strlen_s.
Затем я добавляю строку в код:
#define __STDC_WANT_LIB_EXT1__ 1
А также записать следующее в параметрах компилятора (настройки -> компилятор -> глобальные настройки компилятора -> другие параметры компилятора):
-std=c11
В книге, которую я читаю, есть код для проверки того, поддерживает ли мой компилятор эти функции. Код выглядит следующим образом:
#include <stdio.h>
int main()
{
#if defined __STDC_WANT_LIB_EXT1__
printf("optional functions are defined");
#else
printf("optional functions are not defined");
#endif
return 0;
}
Когда я запускаю этот код, я вижу, что "определены дополнительные функции". Я также переустановил CodeBlocks, но я все еще получаю эти ошибки.
Должен ли я установить другой компилятор? Если я должен, какой из них будет лучшим?
2 ответа
Этого теста недостаточно, вы также должны проверить, определяет ли реализация макрос __STDC_LIB_EXT1__
,
Эти функции взяты из части стандарта C, которая называется "Приложение K" и является необязательной. С помощью этого макроса вы проверяете, предоставляет ли ваша библиотека C эту функцию, с помощью WANT
макрос, определенный перед любым включением, сообщает компилятору, что вы хотите использовать эти функции из приложения K.
Приложение K очень противоречиво, и не многие общедоступные библиотеки C реализуют его. Многие люди думают, что его интерфейсы не обеспечивают безопасность, которую он требует.
И для книги, которую вы читаете, это не кажется слишком надежным. Но тогда я могу быть предвзятым в этом вопросе.
#define __STDC_WANT_LIB_EXT1__ 1
как ожидается, будет определено вашим приложением - вы должны определить его самостоятельно, чтобы включить использование функций интерфейса проверки границ.
Чтобы увидеть, доступен ли интерфейс проверки границ, нужно проверить, __STDC_LIB_EXT1__
определяется компилятором.
Обратите внимание, что ни одна функция не называется strlen_s
существует.