2

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

作者在<string.h>, like中提到了一些“可选”功能,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 和 GCC,因为这是我在大学时做的考试,所以我认为我应该熟悉环境。

问题是,我不知道如何“解决”这个问题,因为strnlen()它不起作用,strnlen_s()不起作用,还有很多其他的,而且我真的无法继续阅读一本书。不是我需要它们,或者我不能以任何其他方式做到这一点(strlen()工作得很好),但知道如何使用非标准函数会很好。

4

3 回答 3

3

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

我假设您正在使用带有 Code::Blocks 的 MinGW 的一些风格 - 我建议使用MinGW-W64,因为它正在积极维护并且非常最新。

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

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

于 2015-02-17T21:37:41.493 回答
3

您说的是微软推出的可选附件 K。

K.2 范围

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

它通常被认为存在严重缺陷,微软试图强迫它被用作严重的麻烦事。
尤其是这种情况,因为他们是唯一实现它们的主要参与者,而且他们的版本不符合标准。

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

您可能想阅读C tag-wiki,尤其是获取 C11 标准的草稿(从 2011 年开始,顾名思义)。

于 2015-02-17T21:41:23.700 回答
2

C11 标准中的可选附件 K 尚未被广泛采用(请参阅下面的 Deduplicator评论)。例如,截至 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...
于 2015-02-17T22:20:57.367 回答