Неопределенная ссылка на `strcpy_s'не может скомпилироваться
Я следую книге и не могу скомпилировать этот пример. Какие-либо предложения?
1 #define __STDC_WANT_LIB_EXT1__ 1
2 #include <string.h>
3 #include <stdio.h>
4
5
6 int main(void)
7 {
8 char source[] = "Here we go...";
9 char destination[50];
10
11 if(strcpy_s(destination, sizeof(destination), source))
12 printf("An error occurred copying the string.n");
13
14
15 return 0;
16 }
ошибка:
/tmp/ccc5KZDZ.o: In function `main':
test.c:(.text+0x48): undefined reference to `strcpy_s'
collect2: error: ld returned 1 exit status
1 ответ
strcpy_s()
функция определена в TR 24731-1 (см. " Используете ли вы" безопасные "функции TR 24731), а также в дополнительном Приложении K ISO/IEC 9899:2011 (стандарт C 2011).
Вы можете проверить, поддерживает ли ваша реализация это:
__STDC_LIB_EXT1__
Целочисленная константа 200509L, предназначенная для указания соответствия данному техническому отчету.
(согласно ТР). Приложение К просто говорит:
Реализация, которая определяет
__STDC_LIB_EXT1__
должны соответствовать спецификациям в этом приложении. 380)380) Реализации, которые не определяют
__STDC_LIB_EXT1__
не обязаны соответствовать этим спецификациям.
Этот ответ указывает на то, что TC1 (Техническое исправление 1) для стандарта C 2011 определяет, что __STDC_LIB_EXT1__
должно быть 201112L (декабрь 2011) для версии функций Приложения K. Я не отслеживал, есть ли различия между Приложением K и TR 24731-1.
Итак, вы должны быть в состоянии проверить, поддерживает ли ваша библиотека strcpy_s()
путем тестирования __STDC_LIB_EXT1__
, но это необязательно. Очевидно, Ульрих Дреппер заявил, что библиотека GNU C не будет поддерживать функции TR 24731-1; Я не знаю, сохраняется ли это до сих пор.
Также следует учитывать, что интерфейсы Microsoft для некоторых из этих функций отличаются от стандартных интерфейсов для одной и той же функции (vsnprintf_s()
, например). Это ограничивает их полезность в качестве кроссплатформенного инструмента переносимости.