考虑以下片段:
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 }
};
...
}
Run Code Online (Sandbox Code Playgroud)
在结构初始化块内调用函数是否合法/可移植?
是的,这是合法的,只要您使用自动存储持续时间初始化对象(如您的示例中所示)。对于具有不合法的静态存储持续时间的对象,因为此类对象仅允许在其初始值设定项中使用常量表达式。
还要记住,在 C 中,初始化表达式的求值是彼此不确定的。这意味着如果您的初始化程序中有多个函数调用并且这些函数的结果取决于某些共享状态,则这些初始化程序的行为可能无法预测
int foo()
{
static int a;
return ++a;
}
int main()
{
struct { int x, y; } s = { foo(), foo() };
/* Can be `{ 1, 2 }` or `{ 2, 1 }`... */
}
Run Code Online (Sandbox Code Playgroud)
关于可移植性,可以注意到 C89/90 不允许这样做(正式在 C89/90 中,所有{}封闭式初始值设定项必须是常量表达式,即使对于自动对象也是如此),但无论如何大多数流行的 C89/90 编译器都支持这一点。