问题标签 [c99]

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 回答
1025 浏览

c - 关于不兼容 printf 格式说明符的问题

我只是在浏览 printf 的手册页,我发生了一些事情。我想知道这里是否有任何“语言律师”可以回答一个相对简单的问题:-P。

所以't'修饰符定义为

以下整数转换对应于 ptrdiff_t 参数。

那么,如果将它与无符号整数转换结合起来会发生什么?显然 o,u,x 和 X 都打算被解释为无符号值,而 d 和 i 是有符号的。

同样size_tssize_t除了ptrdiff_t.

实际上,没有什么不好的事情发生,因为类型的无符号版本与有符号版本占用的空间量相同。所以右边的字节会从堆栈中弹出。

因此,实际上,在打印除“”之外的所有测试事物的预期值时,没有发生任何“坏” INT_MIN(假设sizeof(int) == sizeof(ptrdiff_t).

印刷

在 32 位系统上。

标准对此有何看法?我认为答案将是“未定义的行为”。但我想我会问;)。

0 投票
2 回答
58173 浏览

c - C99 'restrict' 关键字的实际用法?

我正在浏览一些文档和问题/答案,并看到它被提及。我阅读了一个简短的描述,指出这基本上是程序员的一个承诺,即指针不会用于指向其他地方。

任何人都可以提供一些实际使用它的实际案例吗?

0 投票
3 回答
11218 浏览

c - C 中的 ASM 使用 -std=c99 给出错误

我现在愿意编译我的项目,-std=c99但我遇到了一个我暂时不理解的错误。这一行:

仅在 C99 中给我以下错误:

欢迎任何线索帮助我理解这意味着什么。这行不是我写的,我也不确定它的目的是什么。

0 投票
9 回答
28349 浏览

c - C的智能指针/安全内存管理?

我和我认为许多其他人在使用智能指针来包装 C++ 中的不安全内存操作(使用 RAII 等)方面取得了巨大成功。但是,当您有析构函数、类、运算符重载等时,包装内存管理更容易实现。

对于使用原始 C99 编写的人,您可以在哪里指出(不是双关语)来帮助安全内存管理?

谢谢。

0 投票
3 回答
8437 浏览

c - 何时使用限制,何时不使用

我对此有一个大致的了解,restrict但我希望能澄清一些要点。我有一个函数,它从一个缓冲区读取一个以空字符结尾的字符串,并在另一个缓冲区中写出一个 URL 编码版本。该函数有这个签名(目前没有restrict):

unencoded是我的以 null 结尾的源字符串。目标缓冲区由encodedand表示encodedEnd,其中encoded指向缓冲区中的第一个字符charencodedEnd指向缓冲区之后的第一个字符,即该函数将chars 写入但不包括指向的位置encodedEnd- 这是您的基本begin/end迭代器如果您熟悉 C++ STL 约定,请配对。

如果我添加restrict到这个函数,它应该只应用于前两个参数:

或者将它添加到所有三个参数中是否有一些我不理解的好处?

我可以看到制作输入和输出缓冲区restrict有助于编译器知道它们不重叠。但由于最后一个参数 ,encodedEnd仅用于标记输出缓冲区的结束,我认为这restrict对编译器没有任何帮助(尽管我认为它不会伤害,除了增加不必要的噪音到函数声明)。

0 投票
1 回答
233 浏览

c - 在哪里可以找到 Visual Studio 的 C99 数学实现?

我有一些代码使用了 C99 中存在的几个数学函数,但没有在 VS2005 附带的 math.h 或 cmath 中定义。我可以在任何地方获得 C99 的 VS2005 兼容实现吗?

0 投票
3 回答
387 浏览

c - c99之前的限制性

考虑到这段代码,VC9 没有检测到别名:

明显的解决方法是使用临时的:

这是标准行为吗?我期待编译器,除非被告知,否则会假设两个指针都可能有别名。

0 投票
3 回答
4865 浏览

c - 为什么我不能分配一个 const 值,我应该怎么做?

我有一段带有以下粗略签名的代码:

大多数编译器会欣然接受 pArray 的赋值,但会阻塞 nElements 的赋值。这种不一致让我感到困惑,我想开悟。

我可以接受你不能分配一个 const 整数,但是为什么它会像我期望的那样对 const-pointer-to-const 起作用?

快速而廉价的解决方法是删除 const 限定符,但这可能会引入细微的错误,因为循环内的大部分代码都是宏化的(我曾经被那个咬过)。您将如何重组上述内容以允许使用常量元素计数器?

0 投票
5 回答
168 浏览

c - 变量同时定义和赋值

我最近在办公室参加的一次编码风格演讲提倡在定义变量时不应将其分配(到默认值)。相反,它们应该在使用前被分配一个默认值。所以,像

应该不赞成。

显然,'int' 的示例很简单,但对于其他类型(如指针等)也是如此。

此外,还提到了 C99 兼容编译器现在会在上述情况下抛出警告。

上面的方法对我来说只对结构有用,即你只在使用之前对它们进行memset。如果仅在错误分支中使用(或填充)结构,这将是有效的。

对于所有其他情况,我发现定义和分配默认值是一个谨慎的练习,因为我在编写和维护代码时遇到了很多由于未初始化的指针而导致的错误。此外,我相信通过构造函数的 C++ 也提倡相同的方法,即定义和分配。

我想知道为什么(如果)C99 标准不喜欢定义和分配。他们在做编码风格演示所倡导的事情方面有什么可观的优点吗?

0 投票
2 回答
1884 浏览

c - C99 中的易失语义

我正在编写的一些低级代码存在问题,我需要将对象用作易失性对象,但这并不一定是我希望将类型声明为易失性(出于可重用性原因)。但是,我可以定义指向结构的合格变体的指针,如以下部分所述。

现在 foo 实际上是一个指向该类型对象的指针:

因为 volatile 适用于所有结构成员。现在我的问题是当一个对象包含指向另一个对象的指针时,如何应用易失性?

将指向 x 的 volatile 实例的指针然后将其视为:

或作为:

我通读了 C 标准,对此不是很清楚,我可以很容易地以多种方式解释措辞。