问题标签 [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.
c++ - 如何使用 UINT64_MAX 标准库宏?
在学习 C++ 时,我最近遇到了宏的用法,并了解到有许多标准宏,例如这个(以及许多其他整数):
(来自https://en.cppreference.com/w/cpp/types/integer)
我真的不明白它是什么,即使这个名字不言自明(我猜?)以及如何在代码中使用它。
编辑:我知道这个宏返回uint64_t可以包含 的最大值我不知道应该如何以及何时使用它。如果你能给出一个书面的例子和一个“常见的”场景,那就完美了。
c - 是否有符合标准的方法来检测 C 标准库中的函数是否通过内部/内置实现?
是否有符合标准的方法来检测 C 标准库中的函数是否通过内部/内置实现?
如果仅仅是因为函数调用开销,我很有信心我可以实现比标准库为特定调用站点提供的函数更好的代码。但是如果有问题的函数是通过内在/内置实现的,则没有函数调用开销可以击败,因此尝试将是愚蠢的。
如果有办法,我觉得这并不简单,因为它可能因呼叫站点而异。例如,传递一个恒定长度的 tomemcpy
可以为编译器提供一个生成内联代码的好机会,但一个可变长度可能提供一个较小的机会。我想最好的提示可能是三个值之一,“总是”、“从不”或“有时”。这对我来说已经足够了。
只要符合标准,如何实现这一点的细节是可以协商的。该标准的版本甚至是可以协商的,因为这是可测试的,如果该问题对于该标准的早期版本无法回答,我很乐意做出最安全的假设。但当然,在编译时执行此操作的方法将是首选。
(经过编辑以包含具体细节,以便更容易思考,即使这些细节无关紧要)
让我们假设memcpy
确实是有问题的函数,并且我们知道长度始终是可变的,因为它被传递给调用 的函数memcpy
,但我们也知道长度通常为 1。
调用库的开销肯定会支配if (1==length)
和*dst = *src;
。所以问题是 1 实际值的频率是多少,这是一个只有我能回答的问题,以及是否可以消除实现调用库的任何可能性。
memcpy
这个问题不是关于是否可以编写比任何其他标准库函数更快的函数。对此有很多问题,而这不是其中之一。
c - 是否需要在具有多个“return”语句的可变参数函数中的每个“return”语句之前调用“va_end()”?
有一件事总是让我感到困惑va_end()
。我经常读到这不是一个实际的函数,而是一个预处理器宏。尽管这听起来像是一个微不足道的细节,但它实际上可能会影响va_end()
需要调用的位置。
问题很简单:是否va_end()
需要return
在具有多个return
语句的可变参数函数中的每个语句之前调用?
以下示例中的可变参数函数具有返回NULL
其参数的第一个非参数的简单任务。如您所见return
,函数体中有三个语句。其中之一出现在 之后va_start()
但之前va_end()
。
这段代码正确吗?
编辑:
为了澄清起见,上面的示例仅出于教学目的以这种形式编写。在现实生活中,它可以以更好和综合的方式重写为:
c - C 标准和 POSIX 合规性
所以我有几个非常相关的问题(顺序)。
- POSIX 是由 C 标准委员会管理,还是仅仅是启用跨平台功能的标准?
- 是否发布了无视 POSIX 的标准?
- 如果您正在开发一些新的芯片/操作系统并且正在为该系统创建一个不符合 POSIX 标准的 C 实现,那么您的操作系统是否被认为是可移植的(因为您符合 C 标准)?
- C 标准和 POSIX 标准将来会保持分离吗?
非常感谢任何阅读过我的问题的人,当然也感谢任何写过答案的人。
printf - 如何从 LLVM IR 打印浮点数?
我在使用printf()
LLVM IR 中的函数时遇到问题。我只想打印一个浮点数的值,但我只是得到0.000000
. 它适用于整数和字符串,但不适用于浮点数。
简单的例子:
当我用 LLVM 编译它并将它与 Clang 链接并运行可执行文件时,我得到:
如果我使用 .bc 文件运行相同的结果lli
。我已经阅读了这篇相关的帖子,但正如你所见,它也不适用于双打。
c++ - 找不到 Visual Studio 2022 C++ 标准库
我使用 C++ 桌面开发包Screenshot of Visual Studio Installer 安装了 Visual Studio 2022 社区版。构建新的控制台应用程序时出现错误,找不到 C++ 标准库。请让我知道如何解决此问题。Visual Studio 2022 生成错误的屏幕截图。
c++ - C++ 自定义编写的 strncpy 没有将所有字符填充为 null 是否安全?
我正在处理具有固定大小字符数组的结构。假设我真的非常想保持结构的大小很小(或者我需要通过网络发送它们),所以std::string
在我的结构中没有使用(它花费 32 个字节,而我有多个大小为 4-20 的小字符数组)。我对 strncpy 有 2 个问题:
strncpy
具有相同长度的 2 个字符数组将发出有关“可能没有以空字符结尾的字符”的警告,这是有意的,但我不需要该警告。strncpy
用 .填充所有剩余字符(来自dest[strlen(src) -> n-1]
)'\0'
。这在我的程序中浪费了处理。
所以,我strncpy_faster
最多只能为 '\0' 分配 2 个位置:数组的最后一个元素,以及strlen(src)
. 由于std::string()
需要一个以空字符结尾的字符数组 (NTCA),因此我使用charArrayToString()
将非 NTCA 转换为字符串。
这个版本strncpy
安全吗?是否有任何 C/C++ 函数需要strncpy
用 填充所有剩余字节'\0'
,或者它们只需要一个空终止符?我不知道为什么标准要求strncpy
将剩余字节清零。
c - 为什么 stdio.h、stdlib.h、string.h 声明 size_t、NULL 等而不是 #include?
标头stdio.h
, stdlib.h
,string.h
声明size_t
,NULL
等。
为什么要声明size_t
,NULL
等而不是#include <stddef.h>
?
c - 为什么 fseek 有“long int offset”而不是“long long int offset”?
C2x, 7.21.9.2 fseek 函数:
概要
为什么fseek
有long int offset
而不是long long int offset
?
似乎在具有LLP64 或 ILP32数据模型的操作系统(例如 Microsoft Windows)上,2147483647
(2 GB)可能是不够的。