簡體   English   中英

全局靜態變量的順序是否保留在C中?

[英]Is the order of global static variables preserved in C?

考慮:

  typedef struct MS{ 
   uint8_t maxlen; 
   uint8_t curlen; 
   char buf[1];  // dummy length
  } MS; 

  MS ms7;
  char ms7data[6]; /* make storage space */
  MS ms100;
  char ms100data[99]; /* make storage space */

  int main() {
      /* .... */
  }

目的是,例如, ms7.buf將訪問其自己的char, ms7.buf將訪問其后的6,等同於將其聲明為char buf[7] 我的代碼將正確初始化MS字段,並且永遠不會訪問變量ms7data

為此,我需要確保編譯器將遵守(全局,靜態)變量的順序。 我可以依靠嗎? (我知道這對於結構字段是有保證的)。

不,不能保證訂單。 可以移動對象,優化對象等等。

實際上,對於正確的程序來說,不可能確定靜態變量的順序(假設甚至在地址空間上定義了一個順序,對於分段體系結構則可能沒有該順序)。

如果要保證出現幾個全局對象,則必須將它們放置在struct ,例如:

static struct
{
    MS ms7;
    char ms7data[6]; /* make storage space */
    MS ms100;
    char ms100data[99]; 
} globals;

請注意,在這種情況下,結構成員之間可能仍然存在填充,但是您可以使用編譯器擴展來避免這種情況,或者執行sizeof check。

暫無
暫無

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

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