0

我正在使用 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;
}

当我运行此代码时,我看到"optional functions are defined"。我还重新安装了 CodeBlocks,但仍然出现这些错误。

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

4

2 回答 2

1

这个测试是不够的,你还应该测试实现是否定义了宏__STDC_LIB_EXT1__

这些函数来自 C 标准的一部分,称为“附件 K”,是可选的。使用此宏,您可以测试您的 C 库是否提供该功能,WANT在任何包含之前定义的宏告诉编译器您要使用附件 K 中的这些功能。

Annex K 有很大的争议,并且没有多少公共领域的 C 库实现它。许多人认为它的接口没有提供它声称的安全性。

对于您正在阅读的这本书,这似乎不太可靠。但是,我可能对这一点有偏见。

于 2017-08-08T21:57:55.630 回答
1

#define __STDC_WANT_LIB_EXT1__ 1预计将由您的应用程序定义 - 您必须自己定义它以启用边界检查接口功能的使用。

为了查看边界检查接口是否可用,您需要检查是否__STDC_LIB_EXT1__由编译器定义。

请注意,不strlen_s存在调用的函数。

于 2017-08-14T10:51:27.430 回答