问题标签 [compound-literals]

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 投票
4 回答
3392 浏览

c - 数组作为复合文字

在 C99 中,我们可以将复合文字用作未命名数组。

但是这个字面量是常量吗,例如100, 'c',123.4f等等。

我注意到我可以这样做:

而且,我没有编译错误,并且可以猜测该未命名数组的第一个元素被修改为 100。

因此,作为复合文字的数组似乎是左值而不是常量值。

0 投票
1 回答
945 浏览

c - 错误:不允许类型的复合文字

我有一个包含指向回调函数的指针的结构,例如:

然后我在运行时初始化这些函数,并将它们添加到包含其他回调的列表中,并调用一个函数:

当我的结构没有名称(例如 _resman_callbacks)时,这不会导致错误,但是当结构定义中提供名称时,我的 IDE 会显示错误“不允许使用类型为“resman_callbacks”的复合文字”。这不会导致任何运行时问题,也不会导致代码编译失败。这让我有两个问题

A)考虑到我的代码仍然有效,这是否值得关注?

B) 为什么结构的名称会导致错误出现?

我的 IDE 是 Visual Studio Express 2013。

编辑:添加了 register_extension 的声明和实现,以及其他相关数据。

0 投票
1 回答
2454 浏览

gcc - 错误:在编译 &(int) {} 时获取临时 [-fpermissive] 的地址

几天前我在答案中发现了复合文字如何使用 setsockopt(SO_REUSEADDR)?

所以我尝试编译简单的代码:

使用 gcc 4.9.1,它按预期构建和工作,它打印“3”并且 valgrind 不报告内存损坏。

但是使用 g++ 4.9.1,它不会构建:

有没有一种方法(比如 g++ 选项)来支持复合文字?

0 投票
2 回答
559 浏览

c - C中的神秘结构定义

我遇到了以下迷宫定义代码:

从链接的博客文章中,我了解到他们正在尝试用图中的奶酪定义二叉树。

但是,我似乎无法从 C 代码应该做的事情中脱颖而出。如果有人可以向我解释,那就太好了。

0 投票
1 回答
179 浏览

c - 为什么没有类型转换就不能进行复合文字赋值

我对 C 中的文字有疑问。

如果没有类型转换,这似乎行不通?这是什么原因?

0 投票
3 回答
1736 浏览

c - 声明复杂的 C 结构化 const 数据的策略?

我有一个复杂的数据结构(有很多不完整的数组类型/异构长度的结构数组和指向结构数组的结构的指针......)

我想把它们放在闪存中,所以我想把它们放在静态存储的 const 对象中(它们将存储在闪存上)并让编译器完成它的工作。

我正在研究嵌入式环境,其中 ROM==flash== 我无法物理更改的数据。我的内存很少,当然不足以存储我的所有数据。可以告诉 GCC 将存储静态 const 数据毫无问题地放入 ROM。

数据不能动态构建,因为它应该保留在闪存中。

我目前正在使用具有 4.8 gcc 的 C(不是 C++),并且不介意使用 GCCisms。

但是,我不断遇到错误消息,例如:

  • 初始化元素不是常量
  • 不兼容的指针类型
  • ...

与最近的 gcc 版本不同,表明此功能(混合复合文字,指定的初始化程序,...)是最近的或不是主线的。

请注意,此代码是由程序(脚本)生成的。

除了我不断犯的错误(我可以更具体并在那里寻求帮助),你会建议什么策略:

  • 继续尝试使用复合文字来使用复杂的嵌套文字结构
    • 具有大量类型的复合文字
    • 具有多个相互指向的复合文字类型
  • 用它们的名字构建许多中间对象(使整个事情变得非常不可读)
  • 构建一个大的 uint32_t datablob[] 并适当地转换我的结构(由于我的链接器将指定这将在哪里结束,因此无法在对象之间存储指针)

  • 还有其他选择吗?

(编辑:添加细节)

好吧,我的问题更多的是关于通用策略,但这里有一个例子:

我想像我为 A 所做的那样声明一个 C 结构数组。(这意味着我不想复制数据,从磁盘读取数据或对其进行 malloc,只需声明一个包含数据的 const 即可。)

我所有关于文字的例子都非常简单。

我的平台的细节是一个 ARM 微控制器,但只要考虑我想声明一个 const。

0 投票
1 回答
615 浏览

c - 将复合文字分配给具有 const 字段的结构

我有以下代码:

测试.c

编译gcc -std=c99 -Wall test.c -o test失败并出现以下错误:

而编译clang -std=c99 -Wall test.c -o test成功并且生成的可执行文件的行为符合预期。首先,我的示例代码格式正确吗?由于该函数init_test需要一个指向非 const 的指针,struct test我不确定为什么 GCC 认为我正在尝试修改只读变量。在我看来,我只是将类型的文字按位分配给struct test(堆栈)变量t,并且标记结构的字段似乎无关紧要constconstGCC 将在删除时编译正常。这里发生了什么?

0 投票
2 回答
701 浏览

c - clang 和 gcc 使用复合文字的不同行为

最近遇到复合文字,据我了解,以下是正确的使用方法。幸运的是,它适用于 ubuntu 上的 gcc 和 clang。

但是,我注意到另一种使用复合文字的方式,如下所示。感觉有点奇怪;这只是数组初始值设定项。以下代码使用 clang 编译良好,但使用 gcc 编译失败,array initialized from non-constant array expression.

这是故意的还是什么?

环境:

  • gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
  • Ubuntu clang 版本 3.5-1ubuntu1(主干)(基于 LLVM 3.5)

命令:

  • gcc 测试.c
  • 铿锵测试.c
0 投票
2 回答
840 浏览

c++ - 内联结构使用

考虑到这个讨论。我有以下代码

在哪里,

但是 Qt Creator 3.3.0 建议我这还不够好,用红色下划线。但是没有错误消息,程序编译并按预期运行。

为什么 Qt Creator 会在其下划线?

0 投票
2 回答
10304 浏览

c++ - 复合文字是标准 C++ 吗?

复合文字是 C99 结构。即使我可以在 C++ 中做到这一点:

例如,似乎 MSVC 支持它作为扩展。然而,我可以使用的所有编译器都编译上述代码。

那么这是 C++14 中可用的功能吗?是否有不同的标准术语(在我看来,它就像使用大括号初始化创建一个临时的)?


旁注:“复合文字”(或我应该在上面调用的任何内容)是包扩展上下文(仅提及功能)