定义和声明应该匹配吗?

Gop*_*opi -4 c

在我的.h文件中,我有

extern int a[4];
Run Code Online (Sandbox Code Playgroud)

在我的.c文件中

int a[10];
Run Code Online (Sandbox Code Playgroud)

这有什么问题吗?

声明和定义大小很重要?不对?

如果我写入sizeof(a)其中一个文件,那么输出是什么?这是未定义的行为吗?

oua*_*uah 7

如果在源文件中包含头文件,则两个声明a必须与C表示的类型相同:

(C11,6.7p4)"同一范围内涉及同一对象或功能的所有声明均应指定兼容类型."

即使两个声明都在两个翻译单元中,它们也需要具有相同的类型:

(C11,6.2.7p2)"所有引用相同对象或函数的声明都应具有兼容类型;否则,行为未定义."


dra*_*sht 6

看起来像这样:

extern int a[4];
int a[10];

int main()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc报告a的冲突类型:

cc -Wall -g -ggdb -pipe -pedantic -std=gnu99    test.c   -o test
test.c:2:5: error: conflicting types for ‘a’
int a[10];
     ^
test.c:1:12: note: previous declaration of ‘a’ was here
extern int a[4];
            ^
Run Code Online (Sandbox Code Playgroud)

  • 在发布问题之前,加上1应该做OP应该做的事情 (3认同)
  • @musefan如果.h不包含在.c中但在另一个.c中,即使它是未定义的行为,也不会出错. (2认同)