问题标签 [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.
c - 数组作为复合文字
在 C99 中,我们可以将复合文字用作未命名数组。
但是这个字面量是常量吗,例如100
, 'c'
,123.4f
等等。
我注意到我可以这样做:
而且,我没有编译错误,并且可以猜测该未命名数组的第一个元素被修改为 100。
因此,作为复合文字的数组似乎是左值而不是常量值。
c - 错误:不允许类型的复合文字
我有一个包含指向回调函数的指针的结构,例如:
然后我在运行时初始化这些函数,并将它们添加到包含其他回调的列表中,并调用一个函数:
当我的结构没有名称(例如 _resman_callbacks)时,这不会导致错误,但是当结构定义中提供名称时,我的 IDE 会显示错误“不允许使用类型为“resman_callbacks”的复合文字”。这不会导致任何运行时问题,也不会导致代码编译失败。这让我有两个问题
A)考虑到我的代码仍然有效,这是否值得关注?
B) 为什么结构的名称会导致错误出现?
我的 IDE 是 Visual Studio Express 2013。
编辑:添加了 register_extension 的声明和实现,以及其他相关数据。
gcc - 错误:在编译 &(int) {} 时获取临时 [-fpermissive] 的地址
几天前我在答案中发现了复合文字如何使用 setsockopt(SO_REUSEADDR)?
所以我尝试编译简单的代码:
使用 gcc 4.9.1,它按预期构建和工作,它打印“3”并且 valgrind 不报告内存损坏。
但是使用 g++ 4.9.1,它不会构建:
有没有一种方法(比如 g++ 选项)来支持复合文字?
c - 为什么没有类型转换就不能进行复合文字赋值
我对 C 中的文字有疑问。
如果没有类型转换,这似乎行不通?这是什么原因?
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。
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
,并且标记结构的字段似乎无关紧要const
。const
GCC 将在删除时编译正常。这里发生了什么?
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
c++ - 内联结构使用
考虑到这个讨论。我有以下代码
在哪里,
和
但是 Qt Creator 3.3.0 建议我这还不够好,用红色下划线。但是没有错误消息,程序编译并按预期运行。
为什么 Qt Creator 会在其下划线?