strcpy_s 不适用于 gcc

Posted

技术标签:

【中文标题】strcpy_s 不适用于 gcc【英文标题】:strcpy_s not working with gcc 【发布时间】:2017-02-24 01:14:30 【问题描述】:

我有一个 C++11 项目,我添加了一些 strcpy_s 方法调用。 这适用于windows,但是在gcc上编译时,出现错误 声明找不到strcpy_s 符号。

我确实添加了行

#define __STDC_WANT_LIB_EXT1__ 1

到代码,无济于事。

【问题讨论】:

您是否查看了该功能以了解它是什么以及在哪里支持它?对我来说,它看起来像是一个基于快速谷歌搜索的 C11 特性,而 C++11/C++14 是基于 C99 的。有点类似:***.com/q/37569204/560648 Are there any free implementations of strcpy_s and/or TR24731-1?的可能重复 【参考方案1】:

GCC(或者更确切地说,glibc)不支持strcpy_s() 和朋友。有关在哪里可以找到支持它们的库的一些想法,请参见此处:Are there any free implementations of strcpy_s and/or TR24731-1?

【讨论】:

谢谢,约翰。我最终自己实现了它。【参考方案2】:

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。稍加小心,它可能是安全的。

【讨论】:

回复:“你为什么不使用 strncpy 呢?” ——嗯,因为它不起作用?是的,你可以让它工作,但它的设计初衷不是作为strcpy 的“安全”替代品,而且它不是。

以上是关于strcpy_s 不适用于 gcc的主要内容,如果未能解决你的问题,请参考以下文章

将 strcpy_s 用于 TCHAR 指针(Microsoft 特定)

C语言 strcpy_s 函数

strcpy_s 是如何工作的?

如何避免 strcpy_s 缓冲区太小

如何将当前的 strcpy 转换为 strcpy_s?

关于strcpy_s