我得到了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()
工作正常)但是知道如何使用非标准函数会很好。
答案 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...