在Code :: Blocks中使用非标准函数

时间:2015-02-17 21:33:04

标签: c gcc codeblocks c11 tr24731

我得到了Ivor Horton的这本书“Beginning 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;我自己选择了带有GCC的Code :: Blocks,因为那是我在大学时的考试,所以我觉得我应该熟悉环境。

问题是,我不知道如何“修复”这个问题,因为strnlen()不起作用,strnlen_s()不起作用,而其他人也不行,我真的不能继续读一本书。不是我需要它们,或者我不能以任何其他方式执行它(strlen()工作正常)但是知道如何使用非标准函数会很好。

3 个答案:

答案 0 :(得分:3)

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

我认为你正在使用一些MinGW和Code :: Blocks - 我建议使用MinGW-W64,因为它是积极维护的并且是最新的。

此外,TDM-GCC还提供了MinGW-W64 gcc的捆绑工具链。

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

答案 1 :(得分:3)

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

  

K.2范围

     

1本附件规定了一系列可选的扩展,可用于缓解   程序中的安全漏洞,包括新功能,宏和类型   在现有标准标题中声明或定义   2定义__STDC_LIB_EXT1__的实现应符合   本附录中的规范.380)
  3应将K.3子条款读入,就好像它被合并到命名的并行结构中一样   第7条的子条款。

It is generally seen as deeply flawed,微软试图强迫它被用作严重的滋扰 特别是这种情况,因为他们是实施它们的唯一主要参与者,并且他们的版本不符合。

例如,使用gcc的glibc在不引入新功能的情况下提供了该附件的大部分假设优势,不鼓励使用一半的标准库并在程序员身上强制使用这种繁琐的API。

您可能需要阅读C tag-wiki,特别是抓住C11标准的草稿(从2011年开始,顾名思义)。

答案 2 :(得分:2)

C11标准中的可选附件K尚未广泛采用(参见下面的Deduplicator comment)。例如,截至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("%zu\n", strnlen_s(str, 5));

    return 0;
}

输出是:

Optional functions are defined.
5
Press any key to continue...
相关问题