【问题标题】:Does it make a difference to specify its size when declaring an array using extern?使用 extern 声明数组时指定其大小是否有区别?
【发布时间】:2013-08-14 05:29:50
【问题描述】:

例如 这两种说法有什么区别吗:

extern char a[];
extern char a[4];

如果 a(在另一个源文件中)的真正定义是

char a[5];

但不是

char a[4];

【问题讨论】:

标签: c arrays declaration


【解决方案1】:

extern int a[]a 声明为具有未指定大小的int 数组,并被视为“不完整类型”(C.11 §6.7.6.2 ¶4)。不完整类型是没有足够信息来确定其大小的类型(C.11 §6.2.5 ¶1)。使用extern 表示名称具有“外部链接”(C.11 §6.2.2 ¶4)。程序中对具有外部链接的相同名称的所有引用都引用相同的对象(C.11 §6.2.2 ¶2)。

如果您有extern int a[4],但它在其他地方定义为int a[5],那么这将导致未定义的行为(C.11 §6.2.7 ¶2):

引用同一对象或函数的所有声明都应具有兼容的类型;否则,行为未定义

【讨论】:

    【解决方案2】:

    以下内容:

    extern char a[ ]; // (1)
    

    ... 的意思是:“去某个地方寻找一个叫做 a 的字符数组,它存在。”,而:

    extern char a[ c ]; // (2), where c is some constant.
    

    ... 意思是:“去某个地方寻找一个大小为 (char * c) 的字符数组,称为 a,它存在。”。

    两种声明的实际示例:如果数组的大小已知,您应该进行第二次声明。如果你的数组是一个 VLA,那么它应该使用第一个声明来声明。

    【讨论】:

      【解决方案3】:

      我明白了,“extern”语句只是c编译器的“声明语句”。

      “extern char a[4]”的“4”什么都不是。 C 编译器不使用“4”;

      请注意以下几点:

      source a : extern char a[4]
      source b:  char[5]
      
      gcc 4.6.3 compile result : ok
      running result : ok
      

      【讨论】:

      • 源 b 不会编译。
      • -1。如果您在某处使用sizeof a,编译器可能会使用4
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 2021-07-13
      • 2010-10-29
      • 2018-09-07
      • 2016-02-04
      • 2020-02-15
      相关资源
      最近更新 更多