问题标签 [c-standard-library]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
530 浏览

c - setvbuf 的 size 参数对于无缓冲流意味着什么?

该函数setvbuf()可用于使流无缓冲:

  • 当作为 传递时,size参数的值是什么意思?mode_IONBF

  • 缓冲区会被分配吗?

  • 可以通过0吗?

0 投票
1 回答
587 浏览

c - 使用指向 FILE 类型的 const 指针是个好主意吗?

通常,C 文件 I/O 是使用FILE*标准库函数完成的。

在 C 中,也可以有一个const 指针,其中指针的地址不能改变(但它指向的值可以)。

我想知道这是否可以应用于FILE*,所以写了这个小程序来测试这个:

这编译得很好,并且使用 GCC 在 Ubuntu/Linux 16.04 上按预期工作(该文件包含我期望的字符串),但我不确定这个成语是否是一个好主意——该FILE类型在设计和处理上是不透明的是特定于实现的。

因为不能保证任何 C 库实现都不会尝试更改FILE指针的地址,所以在 C 中执行 I/O 时不使用这种方法是否更安全?

0 投票
1 回答
243 浏览

c - snprintf:是否有任何 C 标准提案/计划来更改此函数的描述?

是否有任何关于 C 语言标准的提案(或计划)来更改函数的(最后一句)描述,以便我对这个问题的回答snprintf中描述的歧义- “snprintf() 总是空终止吗?” -解决了吗?

(或者我如何(使用哪些链接)自己确定是否有任何此类提案?
是否有任何搜索引擎可以显示有关该snprintf功能的所有当前有效提案?
我目前知道的唯一链接是这个 - http:/ /www.open-std.org/jtc1/sc22/wg14/ - 这是我第一次对任何标准的提案有特别的想法)

0 投票
2 回答
532 浏览

c - 为什么标准 C 库不需要分为头文件和实现文件?

在 C++ 中创建一个类,或在 C 中使用structs创建一个等价类时,最好将其分成两个文件:一个头文件(用于声明)和一个实现文件(用于实际定义方法等)。

这样做是因为如果方法定义存在于多个文件中,它们可能会发生冲突(并且包含保护不能阻止这种情况,因为宏只存在于定义它们的文件中,并被复制到包含它们的文件中;包含保护防止在同一个文件中多次包含相同的标题)

然而,似乎许多标准 C 库实际上定义了一些东西。让我们stdlib.h以 C 语言为例。这个库似乎定义了一个malloc分配内存的方法。但是(当然)如果我包含stdlib.h在多个文件中,则 malloc 的方法定义似乎没有冲突。

换句话说,如果我要使用自己的内存分配方法创建自己的库(假设它不是宏函数),我将不得不在其中声明它mylib.h并实际定义它,mylib.c但这似乎不适stdlib.h用于某种原因.

这是如何运作的?为什么标准 C 库可以做到这一点,但用户定义的标头(不幸的是,在我看来)不能?

0 投票
1 回答
137 浏览

c++ - 哪些 C 构造出现在 std 命名空间中?

在 C++ 中包含 C 标准库头文件的推荐方法<foo.h>是包含相应的 C++ 头文件<cfoo>

根据我的经验,这会将一些相应的 C 构造放入std命名空间中,但其他一些在全局范围内,有时它们会出现在两个地方(即,在std命名空间和全局范围内)。

它取决于编译器(有些人喜欢size_t只包含std在全局范围内而不是在全局范围内,其他人总是在全局范围内包含它)和构造(例如,尽管包含and ,但既不assert也不error似乎出现在命名空间中)。stdcassertcerrno

标准的要求是什么,是否有任何简单的规则来可移植地访问与std命名空间内外的位置相关的 C 构造(比 更好using namespace std)?

这个问题cfoo涵盖了相同的领域,但那里的答案已经反映了我对所有内容的理解std- 但没有回答为什么在这种情况下喜欢asserterrno不出现的问题std,以及如何知道类似的完整列表“例外”。

0 投票
6 回答
4530 浏览

c++ - “保留用于任何用途”是什么意思?

注意:这是一个问题,尽管我添加了以防某些 C++ 专家可以提供 C++ 使用与 C 不同的措辞的基本原理或历史原因。


在 C 标准库规范中,我们有这个规范文本,C17 7.1.3 Reserved identifiers(强调我的):

  • 所有以下划线和大写字母或另一个下划线开头的标识符始终保留用于任何用途
  • 所有以下划线开头的标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。

现在,我一直在阅读各种受人尊敬的 C 专家关于 SO 的答案,他们声称编译器或标准库可以使用带有下划线 + 大写或双下划线的标识符。

“保留用于任何用途”是否意味着保留给除了 C 语言本身的未来扩展之外的任何人?这意味着不允许实现使用它们。

虽然上面的第二个短语,关于单个前导下划线似乎是针对实现的?

通常,C 标准的编写方式期望编译器供应商/库实现者是典型的读者——而不是应用程序程序员。

值得注意的是,C++ 有一个非常不同的措辞:

  • 每个包含双下划线 ( __) 或以下划线后跟大写字母 (2.11)的名称都保留给实现以供任何使用

(请参阅关于在 C++ 标识符中使用下划线的规则是什么?

这可能是 C 和 C++ 之间的混淆,并且这里的语言不同吗?

0 投票
1 回答
903 浏览

c - 在 C 标准库中使用内存流的目的是什么?

在 C 标准库中,使用内存流(通过为数组创建fmemopen())的目的是什么?与直接操作数组相比如何?

0 投票
2 回答
112 浏览

c - 保证指向标准函数的指针不相等?

C 语言是否保证指向不同名称的标准函数的指针必须比较不相等?

根据6.5.9 等式运算符,¶6,

两个指针比较相等当且仅当两者都是空指针,两者都是指向同一个对象(包括指向对象的指针和其开头的子对象)或函数,...

我似乎记得看到一个解释声称别名(“相同函数”的多个标识符)对于标准函数是允许的,这种处理的规范候选者是getc==fgetcand putc==fputc; 但是,我不知道我可能在哪里看到它,而且我对这个概念持怀疑态度。

是否有任何官方解释或被广泛接受的论点支持或反对这种可能性?

0 投票
2 回答
297 浏览

c - Why the restrictions on C standard I/O streams that interact with sockets?

In book CSAPP section 10.9, it says that there are two restrictions on standard I/O streams that interact badly with restrictions on sockets.

Restriction 1: Input functions following output functions. An input function cannot follow an output function without an intervening call to fflush, fseek, fsetpos, or rewind. The fflush function empties the buffer associated with a stream. The latter three functions use the Unix I/O lseek function to reset the current file position.

Restriction 2: Output functions following input functions. An output function cannot follow an input function without an intervening call to fseek, fsetpos, or rewind, unless the input function encounters an end-of-file.

But I cannot figure out why the restrictions imposed. So, my question is: what factors result to the two restrictions?

It also says that "It is illegal to use the lseek function on a socket.", but how is it possible fseek, fsetpos and rewind use lseek to reset the current file position if it is true?

There is a similar question here, but my question different from this one.

0 投票
1 回答
154 浏览

c - 谁提供了 C 标准库 gcc 或 glibc?

我正在阅读 C Primer Plus。在第 31 页,作者说:

stdio.h文件作为所有 C 编译器包的一部分提供。

但作者没有具体说明实际库代码的来源。

我在 Linux 系统上,我在gcc或之间感到困惑glibc

那么哪一个提供了实际的代码?