我正在使用CodeBlocks和GCC编译器。我想使用"字符串安全功能"例如strlen_s
,strcpy_s
,但编译器显示错误:
对strlen_s的未定义引用。
然后我在代码中添加一行:
#define __STDC_WANT_LIB_EXT1__ 1
除了在编译器选项中编写以下内容(设置 - >编译器 - >全局编译器设置 - >其他编译器选项):
-std=c11
在我正在阅读的书中,有一个代码来检查我的编译器是否支持这些功能。代码如下:
#include <stdio.h>
int main()
{
#if defined __STDC_WANT_LIB_EXT1__
printf("optional functions are defined");
#else
printf("optional functions are not defined");
#endif
return 0;
}
当我运行此代码时,我看到&#34;定义了可选功能&#34; 。我还重新安装了CodeBlocks,但我仍然遇到这些错误。
我应该安装另一个编译器吗?如果我应该,哪一个会是最好的?
答案 0 :(得分:1)
此测试还不够,还应测试实现是否定义宏__STDC_LIB_EXT1__
。
这些功能来自C标准的一部分,称为“附件K”,是可选的。使用此宏,您可以测试C库是否提供该功能,并在任何包含之前定义WANT
宏,告诉编译器您要使用附件K中的这些功能。
附件K存在很大争议,并没有很多公共领域的C库实现它。许多人认为它的接口不能提供它声称的安全性。
对于你正在阅读的这本书来说,这似乎并不太可靠。但是,那时我可能会有偏见。
答案 1 :(得分:1)
#define __STDC_WANT_LIB_EXT1__ 1
应该由您的应用程序定义 - 您必须自己定义它以启用边界检查接口函数。
为了查看边界检查接口是否完全可用,您需要检查编译器是否定义了__STDC_LIB_EXT1__
。
请注意,不存在名为strlen_s
的函数。