问题标签 [anonymous-struct]

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

c - C11 - 将指向结构的指针转换为结构的匿名第一个成员

C标准规定:

一个指向结构对象的指针,经过适当的转换,指向它的初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。

如果所讨论的结构的第一个成员是匿名结构/联合,是否有任何可能(且定义明确)的方式在 C11 中执行这种“合适的强制转换”?或者如果包含的结构是匿名的,则执行“反之亦然”的反向转换?

我猜想强制转换为具有与匿名结构相同的成员序列的非匿名结构会使它的定义不明确,因为它们不兼容,因此不能保证具有相同的内存布局。

但是,C 标准规定:

此外,如果它们的标记和成员满足以下要求,则在单独的翻译单元中声明的两种结构、联合或枚举类型是兼容的:如果用标记声明了一个,则应用相同的标记声明另一个。如果两者都在各自翻译单元内的任何地方完成,则适用以下附加要求:其成员之间应存在一对一的通信<...>

我们可以尝试将此规则应用于匿名结构吗?假设我们有以下设置:

标头.h:

sep.c:

主.c:

(这在gcc (GCC) 4.8.3 20140911上编译并输出 1)。

考虑在print函数内部的强制转换中使用的匿名结构,以及作为 的第一个成员的匿名struct container 结构main.c。它们可以被视为“在单独的翻译单元中声明的类型”吗?此外,它们真的满足所有其他兼容性要求,还是我误解了什么?

0 投票
3 回答
2063 浏览

c - ANSI C 的匿名结构

我想知道是否可以在 ANSI C 中声明匿名结构。我拥有的代码是:

当我编译它时,我得到: 警告:声明没有声明任何东西

我已经读过该标志-fms-extensions可以解决问题,但是它只能在 Windows 系统上运行,因为它产生: 警告:匿名结构是 Microsoft 扩展 [-Wmicrosoft]

我可以使用任何 ANSI 等效扩展吗?

0 投票
4 回答
1991 浏览

c - C:如何访问不同类型的匿名或未命名嵌套结构

0 投票
0 回答
583 浏览

c++ - 编译器在传递 2 中的堆空间不足 - 匿名联合、匿名结构、constexpr 构造函数、静态成员

我的代码无法使用 Visual Studio 2015 社区版进行编译,并出现以下错误:

致命错误 C1002:编译器在传递 2 中的堆空间不足

编码

这是我能够通过反复试验来归结失败状态的最简单的方法,但仍有很多事情要做。

让我目瞪口呆的是,以下每一个更改都会导致它编译得很好......

constexpr从的构造函数中删除B使其工作:

A将's 变量更改为 notstatic使其工作:

intB'sunion的第二个中使用纯文本struct而不是int包装器使其工作:

x在的构造函数中进行默认初始化B而不是传递1使其工作:

最后,将B'sunionInt成员从结构中取出使其工作:

可以说,我完全不知所措。我将非常感谢比我更了解编译器的人的任何帮助。

0 投票
2 回答
311 浏览

c++11 - 匿名结构中的 Brace-or-equal-initializers 在 VS2013 上不起作用

结构中的匿名结构中的大括号或相等初始化器不会对 VS2013 生成的输出执行其工作。有代码:

在 Linux 上使用以下命令编译:

(添加优化标志不影响结果)

预期结果:

奇怪的。用 VS2013 运行它会给出垃圾值。在实现 C++11 标准方面谁是正确的?我高度怀疑这是 GCC 的错。

是否与一些无用的 VS 编译器选项有关?Windows 扩展?由于 MS 的错误,我必须为结构创建默认构造函数?这是荒谬的。

0 投票
1 回答
89 浏览

c++ - 具有匿名结构的不同位映射

我想为一些位实现不同的映射。我想出了这个对我来说效果很好的解决方案:

然后我可以简单地访问不同的位映射

我认为这个功能非常优雅,虽然它不被认为是标准的 C++。g++ 和 clang 产生警告(告诉我匿名结构在标准中没有明确允许),Visual Studio 编译代码而不产生任何警告。

我的问题是:是否有一种现代 C++1x 方法可以编写具有相同功能的相同代码,而不仅仅是命名结构?

0 投票
2 回答
77 浏览

c - C++匿名结构异常定义

看着一些 .h 脚本,我看到了这个:

其中 SIMULRES 在上面定义为:

我假设这是一个匿名结构,但我习惯于看到它是在命名结构中定义的。这在不同的 c++ 编译器中表现如何?方括号内的参数有什么作用?谢谢。

0 投票
2 回答
676 浏览

clang - c11中的嵌套匿名结构

我在 c11 中编写一个 CHIP-8 解释器是为了好玩,我认为使用匿名结构解码操作码会很酷。

理想情况下,如果我有操作码,我会有一个类型opcode_t code = {.bits = 0xABCD}

它应该具有以下属性:

我想出的结构是:

但是,当我运行以下代码来测试我的结构时

输出是 I = d, X = 0, Y = 0, J = 0, NNN = 0, KK = 0

我正在编译这段代码Apple LLVM version 8.1.0 (clang-802.0.42)

使用以下 CMakeLists.txt:

为什么test_opcode.I == 0xD,为什么其余成员都是0x0?

我假设这是因为当我只需要一个 4 位数字时我正在使用 uint8_t,但我认为使用位域可以解决这个问题。

有没有办法可以修改我的 typedef 以具有上述所需的属性?

(我知道我可以使用掩码和位移来获得所需的值,我只是认为这种语法会更好)

提前致谢!

编辑:我将我的 CMakeList 改为拥有set(CMAKE_C_STANDARD_REQUIRED 11),因为我的意思是有一个 C 项目而不是 C++,但是我的代码仍然无法正常工作。

0 投票
2 回答
185 浏览

c - 在匿名结构中使用宏时出现 Doxygen 警告

我有一个结构,按照惯例,我需要使用某个宏来声明该类型的变量:

结构:

宏:

在匿名结构中使用此宏时,我遇到了 Doxygen 的问题,如下所示:

我收到 Doxygen 警告:

什么时候:

1)删除宏

2)不使用匿名结构

我没有收到任何警告。但是我必须使用宏,而且我更喜欢继续使用匿名结构,有什么 Doxygen 命令可以用来避免这个警告吗?

0 投票
4 回答
863 浏览

c - 这个类型结构定义的指针是什么意思(在C中)?

在 K&R 第 6 章中,声明如下:

我不明白这个指针 p 指向哪个结构,以及这样的指针定义是否有效,因为在书中给出的所有其他示例以及我所看到的其他示例中,在定义指向结构的指针时,结构,即定义的类型需要提及。例如,

进而,

因此,有人提到 ptr 指向类型结构示例而不仅仅是结构。

此外,特别感兴趣的是:

*p->str 获取 str 指向的任何内容;*p->str++ 在访问 str 指向的任何内容后递增(就像 *s++);

我一开始就无法理解 p 是什么,因此也不能理解增量和取消引用。

这里发生了什么?

提前致谢!

PS我是新来的,所以对问题格式的任何反馈也将不胜感激。