是否在C中保留了全局静态变量的顺序?

时间:2015-09-15 15:35:04

标签: c static

考虑一下:

  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,还可以访问以下6,等同于它已被声明为char buf[7]。我的代码会正确初始化MS字段,永远不会访问变量ms7data

为此,我需要确保编译器将遵循(全局,静态)变量的顺序。我可以依靠吗? (我知道结构字段有保证。)

1 个答案:

答案 0 :(得分:6)

不,订单无法保证。对象可以移动,优化,等等。

事实上,正确的程序无法确定静态变量的顺序(假设在地址空间中甚至有定义的顺序,可能没有分段架构等)。

如果您想保证按顺序出现多个全局对象,则必须将它们放在struct中,例如:

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

请注意,在这种情况下,struct成员之间可能仍然存在填充,但您可以使用编译器扩展来避免这种情况,或者进行sizeof检查。