c-在代码::块中使用非标准函数



我得到了Ivor Horton的这本书《C开头》,我已经读了一半,我喜欢它;到目前为止还不错。我使用Windows上的Code::Blocks作为我的IDE,现在我遇到了大约3天无法解决的问题。

作者提到了<string.h>中的一些"可选"功能,如strnlen_s(),并表示这些功能在新标准中可用;C11(这本书是2013年的;我不知道C11到底有多新),他还给出了一段代码,将决定"C编译器附带的标准库是否支持这些可选函数"。这是代码:

#include <stdio.h>
int main(void)
{
#if defined __STDC_LIB_EXT1__
    printf("Optional functions are defined.n");
#else
    printf("Optional functions are not defined.n");
#endif
    return 0;
}

因此,我运行代码来检查code::Blocks中的GCC是否存在,并确定它不存在。这本书既没有推荐编译器,也没有推荐IDE;我自己学习了Code::Blocks with GCC,因为这是我在大学里考试的内容,所以我觉得我应该熟悉这个环境。

问题是,我不知道如何"修复"这个问题,因为strnlen()不工作,strnlen_s()不工作,还有很多其他的,我真的无法继续读一本书。并不是说我需要它们,也不是说我不能用任何其他方式(strlen()工作得很好),但知道如何使用非标准函数会很好。

GCC的最新版本当然支持C11,您需要使用编译器标志-std=c11来启用它。

我想你使用的是带有代码::Blocks的MinGW的一些风格——我建议使用MinGW-W64,因为它是积极维护的,而且是最新的。

此外,MinGW-W64的gcc的捆绑工具链可在TDM-gcc上获得。

Code::Blocks IDE本身并不关心您使用的是哪个版本的C,这不会影响您可以使用哪些库。

您所说的是Microsoft推出的可选附件K。

K.2范围

1本附件规定了一系列可选扩展,这些扩展可用于缓解程序中的安全漏洞,包括新的函数、宏和类型在现有标准标头中声明或定义
2定义__STDC_LIB_EXT1__的实现应符合本附件中的规范。380)
3子条款K.3应被视为已合并到命名的并行结构中第7条的子条款。

人们普遍认为它存在严重缺陷,而微软试图强行使用它是一种严重的麻烦
这种情况尤其如此,因为他们是实现它们的唯一主要参与者,而且它们的版本不一致。

例如,带有gcc的glibc提供了该附件的大多数假定优势,而不引入新功能,不鼓励使用一半的标准库,也不强迫程序员使用如此繁琐的API。

你可能想阅读C标签wiki,尤其是C11标准的草案(正如名字所暗示的那样,它来自2011年)。

C11标准中的可选附件K尚未被广泛采用(请参阅下面的重复数据删除器评论)。例如,截至2015年2月,它还没有被合并到glibc中。

好消息是,您可能会尝试另一种编译器。例如,Pelles C For Windows是一个经过修改的LCC,它增强了对最新C11功能的支持(比如原子和C11线程模型,我相信你的书中也提到过)。以下是一些基本程序,可以在其中编译和运行:

#include <stdio.h>
#include <string.h>
int main(void)
{
#if defined __STDC_LIB_EXT1__
    printf("Optional functions are defined.n");
#else
    printf("Optional functions are not defined.n");
#endif
    char *str = "Hello Annex K";
    printf("%zun", strnlen_s(str, 5));
    return 0;
}

输出为:

Optional functions are defined.
5
Press any key to continue...

最新更新