问题标签 [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 - 两个结构初始化之间的区别
a 的以下两个初始化有什么区别Struct
?
和:
从Compiler Explorer中,看起来两者生成了相同的代码:
在结构之前做什么(StructName)
?在进行复杂的初始化时似乎是必要的,例如:
c - 如何在C中声明后初始化结构数组
有没有办法在声明后初始化整个结构数组(可能使用复合文字)?
c++ - 在 C 语言中使用“{}”进行强制转换有什么好处?
我试图理解为什么在 ProcessHacker Code 中使用这种铸造风格。
使用“{}”进行强制转换有什么好处?它适用于 C 和 C++ 吗?
c - 为什么在以下结构定义中需要显式强制转换
通过struct
复合文字进行初始化,它将自己进行转换。例如:
但是,如果我分开定义,我必须添加一个显式转换:
代码:https ://godbolt.org/z/dG8nMh
如果我(cast_type)
在第二个中省略了,我会得到一个错误 error: expected expression before ‘{’ token
。为什么会这样?
也就是说,为什么初始化不需要强制转换但其他定义需要?我的想法是第二个版本应该能够在没有显式转换的情况下自行解决,但显然这是不正确的。
c - 在添加条目之前将数组归零
以下是否将列表清零然后添加第一个条目?或者它只是将第一个条目添加到handlers
?
例如,这样做是否:
还是不涉及清算?
c - 如何将结构复合文字作为参数传递给函数?
这是struct
我所拥有的:
我想将 this 的复合文字struct
作为参数传递给函数,如下所示:
但是,这给了我一个错误:
错误:“{”标记之前的预期表达式
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()
。但我不确定标准对此有何规定。有保证吗 ?它依赖于实现吗?
c - 为给定范围创建一次复合文字
我很困惑N2346::6.5.2.5/15
,N2346::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?我的推理有什么问题?
c - C:使用指针静态初始化复合结构
我有一个嵌套的 C (gcc-11) 结构,其中包含指向另一个结构的指针数组。我想创建一个这种类型的静态变量并同时对其进行初始化。所有这些都在一个头文件中。原因是它代表了属于该头文件的一些默认值。我不想调用初始化函数来设置它。
以下编译OK:
但我想要一个指针数组:s1_t **s1s
准确地说。这不会编译:
这些是第一个错误:
c - 结构初始化和分配与临时创建和分配——它们是否相同?
考虑以下代码:
Afaik f1 是一个使用指定初始化器部分初始化的结构体,它的所有省略字段都保证用零初始化。但是 C 标准是否保证 f1 与 f2 相同?f2 创建语法究竟是如何调用的?