问题标签 [c11]

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

c - 使用 _Alignas 进行结构成员对齐

我想知道以下问题:_AlignasC11 中的新对齐说明符是否适用于结构成员?

我一直假设这么多,但是对 N1570 公开草案的彻底阅读似乎表明对齐说明符不能出现在说明符限定符列表中,如果支持的话,这是我期望的位置. 我已经阅读了几次语法,但无法弄清楚_Alignas在结构成员声明中应该如何被允许。

但是,在我看来,该标准的意图是 _Alignas应该适用于结构成员,因为_Alignas(第 6.7.5 节)的段落指出“对齐属性不应在 [...] 的声明中指定位域”。鉴于术语“位域”在第 6.7.2.1 节中定义为结构成员(准确的措辞:“这样的成员称为位域”),我一直将这句话解释为隐含地表示对齐说明符是允许非位域成员。

检查现有实现表明,Clang 3.0 和 GCC 4.7 都支持_Alignas结构成员而不会抱怨(带有-pedantic)。Clang 源代码复制了与 N1570 相同的语法,但Parser::ParseSpecifierQualifierList 允许使用对齐说明符;不过,该函数确实包含一个 TODO 元素,内容如下:

GCC C 解析器代码看起来很相似,即即使它引用了标准语法,它也允许在说明符-限定符列表中使用对齐说明符。

我还检查了已知缺陷列表以及 comp.lang.c 和 comp.std.c,以查看是否在此处提出了该主题,但似乎并非如此。因此,我的问题是:结构成员是否应该允许使用对齐说明符?

编辑:相关的语法规则是:

0 投票
5 回答
5476 浏览

c++ - 为什么 C11 或 C++11 中没有 ASCII 或 UTF-8 字符文字?

为什么即使有 UTF-8 字符串文字,C11 或 C++11 中也没有 UTF-8 字符文字?我知道,一般来说,字符文字表示单个 ASCII 字符,它与单个八位字节的 UTF-8 代码点相同,但是 C 和 C++ 都没有说编码必须是 ASCII。

基本上,如果我阅读标准正确,则不能保证'0'将表示整数 0x30,但u8"0"必须表示字符序列 0x30 0x00。

编辑:

我知道不是每个 UTF-8 代码点都适合一个字符。这样的文字仅对单八位字节代码点(又名 ASCII)有用,所以我想称它为“ASCII 字符文字”会更合适,所以问题仍然存在。我只是选择用 UTF-8 来构建问题,因为有 UTF-8 字符串文字。我可以想象可移植地保证 ASCII 值的唯一方法是为每个字符编写一个常量,考虑到只有 128 个字符,这不会那么糟糕,但仍然......

0 投票
2 回答
3527 浏览

gcc - 位域的 GCC 实现中的一个错误

在 C11 中工作,以下结构:

由 GCC 布局为一个unsigned(4 个字节),其中使用了 4 个位,然后是一个_Bool(4 个字节),其中使用了 1 个位,总大小为 8 个字节。

请注意,C99 和 C11 特别允许_Bool作为位域成员。C11 标准(可能还有 C99)还在 §6.7.2.1 'Structure and union specifiers' ¶11 中声明:

实现可以分配任何大到足以容纳位字段的可寻址存储单元。如果有足够的空间剩余,紧跟在结构中另一个位域之后的位域将被打包到同一单元的相邻位中。

所以我认为b上面的 member 应该已经被打包到为 member 分配的存储单元中a,从而产生了一个总大小为 4 字节的结构。

GCC 行为正确,并且在对两个成员使用相同类型时,或者当一个 isunsigned和另一个时,确实会发生打包,但是GCC 似乎认为signed类型unsigned和类型过于不同,无法正确处理它们。_Bool

有人可以确认我对标准的解释,这确实是一个 GCC 错误吗?

我也对解决方法感兴趣(一些编译器开关,编译指示,__attribute__...)。

我正在使用 gcc 4.7.0 -std=c11(尽管其他设置显示相同的行为。)

0 投票
1 回答
1340 浏览

c - P99 和 C99 与 C11

也许我误解了P99库的使用,但它比 C11 提供了什么优势(主要关注多线程),如果它不仅仅是一个模拟器的话。

速度?效率?

还是只是向后兼容?

0 投票
4 回答
10655 浏览

c - 是否通过 C99 中未指定的联合进行类型双关,并且它是否已在 C11 中指定?

Stack Overflow 问题Getting the IEEE Single-precision bits for a float的一些答案建议使用union结构来进行类型双关(例如:将 a 的位float转换为 a uint32_t):

但是,uint32_t根据 C99 标准(至少草案 n1124),工会成员的价值似乎未指定,其中第 6.2.6.1.7 节规定:

当一个值存储在联合类型对象的成员中时,对象表示中不对应于该成员但对应于其他成员的字节采用未指定的值。

C11 n1570 草案的至少一个脚注似乎暗示情况不再如此(见 6.5.2.3 中的脚注 95):

如果用于读取联合对象内容的成员与上次用于在对象中存储值的成员不同,则将值的对象表示的适当部分重新解释为新类型中的对象表示在 6.2.6 中描述(有时称为“类型双关语”的过程)。这可能是一个陷阱表示。

但是,C99 草案中的第 6.2.6.1.7 节的文本与 C11 草案中的文本相同。

这种行为在 C99 下实际上是未指定的吗?是否已在 C11 中指定?我意识到大多数编译器似乎都支持这一点,但很高兴知道它是在标准中指定的,还是只是一个非常常见的扩展。

0 投票
1 回答
2421 浏览

c - 如何使用 __STDC_VERSION__ 检查 -std=c1x 是否正在使用?

我知道对于 C11,我可以测试#if(__STDC_VERSION >= 20112L). 但对于-std=c1x

我应该测试什么宏和/或值?

这个标准的命名是什么?或者可能是一个非正式的名字,如果有的话。我希望这很清楚。提前致谢。

0 投票
1 回答
2170 浏览

c - 关于数组下标运算符

引用 C11 标准:

数组订阅(§ 6.5.2.1)

下标运算符的定义[]E1[E2]相同(*((E1)+(E2)))

我想知道为什么括号是E1必要的(C89标准中缺少它们),哪个表达式可以(*(E1+(E2)))不同于(*((E1)+(E2)))

0 投票
1 回答
1006 浏览

c++ - 与从变量中简单读取相比,带有 memory_order_relaxed 的 atomic_load() 是否会引入任何额外的开销?

我看不出有任何理由为“本机”CPU 积分增加额外开销,但我可能错了,所以我想听听社区的意见

我真正的问题涉及某种相对罕见的变化但经常阅读的链表(类似于典型的 RCU 用例)。这个想法是为只读操作提供两种访问模式:如果结构现在正在改变(完全成熟的无锁算法),则使用第一种模式,第二种轻量级模式用于“平静”情况(使用非原子列表遍历)。对于第二种(轻量级)情况,我将使用带有 memory_order_relaxed 的原子负载,但如果它太昂贵,我需要做一些解决方法(缓存非原子变量中的原子值,或以某种方式模拟建议的 memory_order_nonatomic http ://www.open-std.org/jtc1/sc22/wg14/www/docs/n1446.htm等)

我知道答案取决于原子实现(和 CPU),但我希望实现应该合理:)

0 投票
3 回答
804 浏览

c++ - Differences between certain standards of C and C++

Where can i see all differences between C++11 and C99?

I think that C++98 and C++03 based on C89 / C90. Is there any differences between them? And what about C++11 and C99? Some features from C99 were added to C++11, but others not (like compound literals, VLAs, etc). Can i see complete list of this changes or not?

0 投票
1 回答
1259 浏览

c - C11 与 C99 中临时对象的生命周期

我试图破译导致 C99 和 C11 之间变化的注释。该说明中提出的更改最终出现在 C11 的 6.2.4:8 中,即:

具有结构或联合类型的非左值表达式,其中结构或联合包含具有数组类型的成员(递归地,包括所有包含的结构和联合的成员)是指具有自动存储持续时间和临时生命周期的对象。它的生命周期从计算表达式时开始,它的初始值是表达式的值。当包含完整表达式或完整声明符的评估结束时,它的生命周期结束。任何修改具有临时生命周期的对象的尝试都会导致未定义的行为。

我理解为什么需要进行更改(可以在此处找到一些讨论。请注意,讨论可以追溯到 C11 之前)。然而,我不明白的是克拉克尼尔森在写他的笔记时所说的旁白:

请注意,这种方法另外声明了一个符合 C99 标准的示例为不符合标准:

我明白为什么这个例子在 C11 下不符合标准。我特别不明白的是它是如何符合 C99 的。而且,如果它是在 C99 下定义的,那么它应该做什么,定义地打印悬空指针的值?