簡體   English   中英

struct初始化中的call函數

[英]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編譯器都支持這一點。 。

在結構初始化塊中調用函數是合法/可移植的嗎?

初始化(§6.7.8/ 1)

[...]

 | initializer-list: | designationopt initializer | initializer-list , designationopt initializer 

〜> initializer-lists由初始化程序組成

初始化(§6.7.8/ 4)

具有靜態存儲持續時間的對象的初始化程序中的所有表達式應為常量表達式或字符串文字

〜>初始化程序由表達式組成。 (對於具有靜態存儲持續時間的對象,為constant-expr。)

表達式(§6.5/ 1)

表達式是操作符和操作數的序列,其指定值的計算,或指定對象或函數,或者生成副作用,或執行其組合。

〜>函數調用是一個表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM