问题标签 [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 投票
1 回答
53 浏览

c - 两个结构初始化之间的区别

a 的以下两个初始化有什么区别Struct

和:


Compiler Explorer中,看起来两者生成了相同的代码:

在此处输入图像描述


在结构之前做什么(StructName)?在进行复杂的初始化时似乎是必要的,例如:

同样与可能初始化/分配结构指针的两个答案有关?.

0 投票
3 回答
185 浏览

c - 如何在C中声明后初始化结构数组

有没有办法在声明后初始化整个结构数组(可能使用复合文字)?

0 投票
2 回答
173 浏览

c++ - 在 C 语言中使用“{}”进行强制转换有什么好处?

我试图理解为什么在 ProcessHacker Code 中使用这种铸造风格。

使用“{}”进行强制转换有什么好处?它适用于 C 和 C++ 吗?

0 投票
5 回答
87 浏览

c - 为什么在以下结构定义中需要显式强制转换

通过struct复合文字进行初始化,它将自己进行转换。例如:

但是,如果我分开定义,我必须添加一个显式转换:

代码:https ://godbolt.org/z/dG8nMh

如果我(cast_type)在第二个中省略了,我会得到一个错误 error: expected expression before ‘{’ token。为什么会这样?

也就是说,为什么初始化不需要强制转换但其他定义需要?我的想法是第二个版本应该能够在没有显式转换的情况下自行解决,但显然这是不正确的。

0 投票
2 回答
48 浏览

c - 在添加条目之前将数组归零

以下是否将列表清零然后添加第一个条目?或者它只是将第一个条目添加到handlers

例如,这样做是否:

还是不涉及清算?

0 投票
1 回答
127 浏览

c - 如何将结构复合文字作为参数传递给函数?

这是struct我所拥有的:

我想将 this 的复合文字struct作为参数传递给函数,如下所示:

但是,这给了我一个错误:

错误:“{”标记之前的预期表达式

0 投票
1 回答
31 浏览

c-preprocessor - 宏内的双重评估:使用 sizeof() 来确定作为复合文字传递的数组大小

C99 使得基本上可以在任何地方将数组定义为复合文字。

例如,给定一个sumf()接受数组float作为输入的普通函数,我们期望原型为: float sumf(const float* arrayf, size_t size);

然后可以这样使用: float total = sumf( (const float[]){ f1, f2, f3 }, 3 );

这很方便,因为不需要事先声明变量。语法有点难看,但这可以隐藏在宏后面。

但是,请注意最后的3. 这是数组的大小。它是必需的,以便sumf()知道在哪里停止。但是随着代码老化和重构,它也很容易产生错误,因为现在第二个参数必须与第一个参数定义保持同步。例如,添加f4需要将此值更新为 4,否则函数会返回错误的计算(并且没有警告通知此问题)。

所以最好保持两者同步。

如果它是通过变量声明的数组,那将很容易。我们可以有一个宏,它可以像这样简化表达式:float total = sumf( ARRAY(array_f) );只需#define ARRAY(a) (a) , sizeof(a) / sizeof(*(a)). 但是,array_f必须在调用函数之前定义,因此它不再是复合文字。

由于是复合字面量,所以没有名字,所以不能被引用。因此,我找不到比在两个参数中重复复合文字更好的方法了。

这会奏效。将一个添加f4到列表中会自动将size参数更新为正确的大小。

但是,只要所有成员都是变量,这一切都可以正常工作。但是如果它是一个函数呢?该函数会被调用两次吗?比如说:float total = sumf ( LIST_F( v1, f2() ) );,会f2()被调用两次吗?f2()正如在 中提到的那样,这对我来说并不清楚sizeof(),因此理论上它可以在不实际调用的情况下知道返回类型的大小f2()。但我不确定标准对此有何规定。有保证吗 ?它依赖于实现吗?

0 投票
1 回答
76 浏览

c - 为给定范围创建一次复合文字

我很困惑N2346::6.5.2.5/15N2346::6.5.2.5/16哪些州(雇员。我的)

15 示例 8 每个复合文字只在给定范围内创建一个对象

函数 f() 总是返回值 1。

16 请注意,如果使用迭代语句而不是显式 goto 和标记语句,则未命名对象的生命周期将仅是循环的主体,并且在下次进入时 p 将具有不确定的值,这将导致在 未定义的行为中。

在我看来,这句话与标准的另一部分相矛盾。恰恰:

N2346::6.5.2.5/5

如果复合文字出现在函数体之外,则该对象具有静态存储持续时间;否则,它具有与封闭块关联的自动存储持续时间。

这意味着使用复合文字创建的块范围对象具有自动存储持续时间。

N2346::6.8/3(雇员我的):

具有自动存储持续时间的对象的初始值设定项,以及具有块范围的普通标识符的可变长度数组声明符,每次声明时都会被评估并将值存储在对象s 中(包括在没有初始值设定项的对象中存储不确定值)是按 执行顺序到达的,就好像它是一个语句,并且在每个声明中按照声明符出现的顺序。

因此,即使goto示例中的语句N2346::6.5.2.5/15被替换为迭代语句,复合文字创建的对象也应该在每次到达时重新创建。

问题:为什么用goto迭代语句替换会产生 UB?我的推理有什么问题?

0 投票
1 回答
38 浏览

c - C:使用指针静态初始化复合结构

我有一个嵌套的 C (gcc-11) 结构,其中包含指向另一个结构的指针数组。我想创建一个这种类型的静态变量并同时对其进行初始化。所有这些都在一个头文件中。原因是它代表了属于该头文件的一些默认值。我不想调用初始化函数来设置它。

以下编译OK:

但我想要一个指针数组:s1_t **s1s准确地说。这不会编译:

这些是第一个错误:

0 投票
4 回答
56 浏览

c - 结构初始化和分配与临时创建和分配——它们是否相同?

考虑以下代码:

Afaik f1 是一个使用指定初始化器部分初始化的结构体,它的所有省略字段都保证用零初始化。但是 C 标准是否保证 f1 与 f2 相同?f2 创建语法究竟是如何调用的?