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的主要内容,如果未能解决你的问题,请参考以下文章