strcpy_s не работает с gcc

У меня есть проект C++11, и я добавил несколько вызовов методов strcpy_s. Это работает в Windows, но при компиляции в gcc возникает ошибка о том, что символ strcpy_s не найден.

я добавил строку

#define __STDC_WANT_LIB_EXT1__ 1

к коду, безрезультатно.


person Jacko    schedule 14.10.2016    source источник
comment
Вы искали функцию, чтобы узнать, что это такое и где она поддерживается? Судя по быстрому поиску в Google, мне кажется, что это функция C11, а C++11/C++14 основаны на C99. Что-то похожее: stackoverflow.com/q/37569204/560648   -  person Lightness Races in Orbit    schedule 14.10.2016
comment
Возможный дубликат Существуют ли бесплатные реализации из strcpy_s и/или TR24731-1?   -  person S.S. Anne    schedule 11.10.2019


Ответы (2)


GCC (точнее, glibc) не поддерживает strcpy_s() и др. Некоторые идеи о том, где вы можете найти библиотеку, которая их поддерживает, см. здесь: Есть ли бесплатные реализации strcpy_s и/или TR24731-1?

person John Zwinck    schedule 14.10.2016
comment
Спасибо, Джон. Я только что реализовал это сам. - person Jacko; 14.10.2016

strcpy_s и друзья еще не являются частью C++. Похоже, что C++17 они будут , но на данный момент их предоставление зависит от реализации. Кажется, glibc этого не делает.

На самом деле, согласно cppreference, __STDC_WANT_LIB_EXT1__ будет работать, только если __STDC_LIB_EXT1__ определенный. В моем Arch Linux это не так.

#ifdef __STDC_LIB_EXT1__
constexpr bool can_have_strcpy_s = true;
#else
constexpr bool can_have_strcpy_s = false;
#endif

Вы можете использовать strncpy. При некоторой осторожности это может быть безопасно.

person krzaq    schedule 14.10.2016
comment
Re: Почему бы вам не использовать strncpy? -- эм, потому что это не работает? Да, вы можете заставить его работать, но он не был разработан как безопасная замена strcpy, и это не так. - person Pete Becker; 14.10.2016