"Строковые безопасные функции" и 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 существует.

Другие вопросы по тегам