声明与定义

时间:2013-06-23 19:23:34

标签: c++

代码:

  int main()
      {
        extern int a;
        int b;
        cout<<sizeof(a)<<endl;
        cout<<sizeof(b)<<endl;
      }

输出:

4
4

如果我们只声明一个变量,它不应该为该变量分配内存(?)。 那么编译器如何不为

提供错误
 cout<<sizeof(a)<<endl;

或为什么程序没有崩溃?

6 个答案:

答案 0 :(得分:4)

sizeof不需要计算传递给它的表达式,只需要计算它的类型。外部定义extern int a足以确定类型,因此sizeof成功。

此外,由于sizeof内的表达式未被评估,程序链接没有错误。

答案 1 :(得分:3)

sizeof在编译时解析。所有编译器需要的是一个完整类型的声明 - 需要为对象分配存储空间。

由于sizeof表达式在编译时被解析,因此无法检查对象是否实际上是在另一个编译单元中定义的。如果我们想要这个检查我们无法在编译时评估sizeof(我们必须将它推迟到链接时间),并且没有充分的理由来解决这个问题。

答案 2 :(得分:2)

编译器知道int的大小为4,并且在编译之后没有任何东西可以给int另一个大小。因此,sizeof(a)变为sizeof(int),变为4

答案 3 :(得分:2)

sizeof()不是一个函数,它是一个语言关键字,它解析为编译时常量。

所以 - 您没有访问或使用“a”,而是向编译器询问有关您提供的有关“a”的信息之一的问题。

cout << sizeof( a ) << endl:

实际上是

cout << sizeof decltype(a) << endl;

实际上是

cout << sizeof int << endl;

实际上是

cout << 4 << endl;

您可以通过查看装配输出来验证这一点。在Linux下,使用GCC或Clang,

c++ -Wall -o test.S -S test.cpp

将生成程序集文件供您检查。

答案 4 :(得分:1)

因为它获得的是变量类型的大小而不是实际使用的内存大小(应该是相同的)。

int main () {
    int a = 2;

    std::cout << sizeof ((char) a) << std::endl; // Outputs 1

    return 0;
}

答案 5 :(得分:1)

使用extern int a,您只是告诉编译器某处(应该是)a类型为int的变量。但是,您唯一要做的就是将sizeof应用于它。现在,编译器不需要访问a来了解它的大小:由于您告诉编译器a类型为int,它已经知道它的大小:所有{{1} } s的大小相同。

为什么编译器没有给出错误:int实体缺少定义只会在实际使用该实体时出错。由于extern不使用它,但只告诉您大小,因此不会出现编译错误。

相关问题