Почему я получаю предупреждения, используя strcpy_s и strcat_s?
Я запрограммировал пример на своем ПК с Win64 с блоками кода, используя strcpy_s и strcat_s. Программа работает, но я получаю предупреждающие сообщения «предупреждение: неявное объявление функции 'strcpy_s' для strc_s и strcat_s соответственно. В настройках компилятора включен C11. И почему я не могу найти две функции в string.h?
// This program uses strcpy_s and strcat_s to build a phrase.
#include <string.h> // for strcpy_s, strcat_s
#include <stdio.h> // for printf
int main(void)
{
char stringBuffer[80];
strcpy_s(stringBuffer, sizeof(stringBuffer), "Hello world from ");
strcat_s(stringBuffer, sizeof(stringBuffer), "strcpy_s ");
strcat_s(stringBuffer, sizeof(stringBuffer), "and ");
strcat_s(stringBuffer, sizeof(stringBuffer), "strcat_s!");
printf("stringBuffer = %s\n", stringBuffer);
}
2 ответа
Из cppreference:
Как и все функции с проверкой границ, strcpy_s гарантированно доступна только в том случае, если
__STDC_LIB_EXT1__
определяется реализацией, и если пользователь определяет__STDC_WANT_LIB_EXT1__
к целочисленной константе 1 перед включением<string.h>
.
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
См. также: доступность __STDC_LIB_EXT1__ в gcc и clang.
Как близкие заменители методов strcpy() и strcat(), функции strcpy s() и strcat s() описаны в ISO/IEC WDTR 24731. (). Максимальная длина целевого буфера определяется дополнительным аргументом типа rsize t, который требуется для этих процедур.
При отсутствии нарушений ограничений функция strcpy s() эквивалентна функции strcpy(). Функция strcpy s() дублирует символы из исходной строки, включая завершающий нулевой символ, в целевой массив символов. Если функция выполнена успешно, она возвращает 0.
Только когда исходная строка может быть полностью скопирована в место назначения без заполнения буфера назначения, функция strcpy s() завершается успешно. если максимальный размер целевого буфера равен нулю, больше, чем RSIZE MAX, или меньше, или если либо исходный, либо целевой указатели имеют значение NULL