Неопределенная ссылка на `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(), например). Это ограничивает их полезность в качестве кроссплатформенного инструмента переносимости.

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