C中的extern类型声明冲突

时间:2013-07-14 21:14:21

标签: c++ c extern

int main()
{
    extern long long a;
    a=100000000000; //10 raised to power 11
    printf("%lld",a);
    return 0;
}
int a;

输出:100000000000

int一个平均值定义,它将4个字节分配给变量a,但是extern long long a是指定变量类型的声明,与内存分配无关。因此,如果我将一个值10 ^ 11分配给a(4字节大),它不应该导致溢出吗?

1 个答案:

答案 0 :(得分:0)

是的,确实会导致溢出。幸运的是,你的程序很短,你没有注意到损坏。

您的代码将8个字节写入4字节变量。这将在内存中a之后的任何内容上涂鸦。在你的情况下,在a之后没有声明,所以它可能是在可用空间上写的,但这并不能保证。无论如何,似乎没有什么关键取决于成功完成你的程序的记忆。

有些编译器可能能够检测到这一点,但有些则不会。在一般情况下,在不同的源文件中声明a,这是不可检测的。这就是为什么最好将extern声明放在头文件中,然后在声明真实变量的源文件中包含该头,以及使用它的源文件;这样编译器就有机会检查声明匹配。