[英]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.