代码之家  ›  专栏  ›  技术社区  ›  choxsword

声明和定义之间的冲突是否会导致未定义的行为?

  •  12
  • choxsword  · 技术社区  · 6 年前

    extern int a[10];
    int main()
    {
       (void)sizeof(a);
       return 0;
    }
    

    在第二个源文件中,我们有:

    int a[20];//different with the first source 
    

    上述代码是否会导致 未定义的行为 C 它说:

    兼容的 类型;否则,行为是未定义的。

    int[10] int[20] 兼容的 c (中国的观点)?那怎么办 C++ 标准

    sizeof(a) a 你有什么声明吗?

    2 回复  |  直到 6 年前
        1
  •  10
  •   Shafik Yaghmour    6 年前

    是的,这在C中是未定义的行为,它们不兼容,请参见C11 6.7.6.2 Array declarators paragraph 6

    元素类型,如果两个大小说明符都存在,则为 整数常量表达式,则两个大小说明符应具有 这要求它们是兼容的,如果 两个大小说明符的计算结果不相等。

    [basic.link]p11 :

        2
  •  1
  •   supercat    6 年前

    一些实现将根据平台的一组约定定义的规则来处理导入和导出的符号,这些约定通常在文档中描述,用现代的说法,文档称为应用程序二进制接口。如果一个模块(编译单元)导出一个符号,而另一个模块导入该符号,则无论导入或导出符号的代码的语言规则如何,每个定义及其交互都将按照ABI的描述进行。

    因为这两种方法都有很大的优点和缺点,所以该标准对于实现如何处理不同模块中的函数之间的交互是不可知的。如果平台ABI碰巧定义了一种行为, C实现记录了C模块以ABI定义的方式进行交互,然后在该实现上定义行为,而不管标准是否强制要求。在标准没有规定要求的其他情况下,任何事情都可能发生。