[英]call function in struct initialization
请考虑以下代码段:
struct my_struct {
int a;
int b;
int c;
};
void my_func(unsigned long x)
{
struct my_struct m[] = {
{ 0, 1, 2 },
{ 11, 22, htonl(x) },
{ 0x1, 0xa, 0xbb }
};
...
}
在结构初始化块中调用函数是合法/可移植的吗?
是的,它是合法的,只要您使用自动存储持续时间初始化对象(如您的示例中所示)。 对于静态存储持续时间不合法的对象,因为此类对象仅允许在其初始化程序中使用常量表达式。
还要记住,在C评估中,初始化表达式是相对于彼此不确定地排序的 。 这意味着如果初始化程序中有多个函数调用,并且这些函数的结果取决于某些共享状态,则这些初始化程序可能会出现不可预测的行为
int foo()
{
static int a;
return ++a;
}
int main()
{
struct { int x, y; } s = { foo(), foo() };
/* Can be `{ 1, 2 }` or `{ 2, 1 }`... */
}
关于可移植性,可以注意到C89 / 90不允许这样做(正式在C89 / 90中,所有{}
封闭的初始化器必须是常量表达式,即使对于自动对象也是如此),但是大多数流行的C89 / 90编译器都支持这一点。 。
在结构初始化块中调用函数是合法/可移植的吗?
[...]
| initializer-list: | designationopt initializer | initializer-list , designationopt initializer
〜> initializer-lists由初始化程序组成
具有静态存储持续时间的对象的初始化程序中的所有表达式应为常量表达式或字符串文字
〜>初始化程序由表达式组成。 (对于具有静态存储持续时间的对象,为constant-expr。)
表达式是操作符和操作数的序列,其指定值的计算,或指定对象或函数,或者生成副作用,或执行其组合。
〜>函数调用是一个表达式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.