"字符串安全功能"和gcc

时间:2017-08-08 15:52:12

标签: gcc codeblocks c-strings c11 tr24731

我正在使用CodeBlocks和GCC编译器。我想使用"字符串安全功能"例如strlen_sstrcpy_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,但我仍然遇到这些错误。

我应该安装另一个编译器吗?如果我应该,哪一个会是最好的?

2 个答案:

答案 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的函数。