C++ 变量声明与定义的区别

987 阅读2分钟
  1. 变量的声明:告诉这个变量的类型和名字,可以多次声明,但只能定义一次
  2. 变量的定义:变量的定义会分配内存存储空间,可以为变量指定初始值。注意,同一程序中变量只能定义一次。
  3. 两者之间有何区别:

定义一个变量,实际上也是声明了它的数据类型和名字,因此定义包含了声明。但是声明就不是定义了,前面说过,声明仅仅告诉我们变量的数据类型和名字,并未分配存储空间,因此还不能使用。

举个例子:

// Demo1.hpp 头文件

#ifndef Demo1_hpp
#define Demo1_hpp

#include <stdio.h>

// 变量声明,告诉变量的类型,但未实现
extern int i;

// 函数声明, 未实现
int sum(int a, int b); 

#endif /* Demo1_hpp */

如果将这个头文件给你,不给你实现。你能正常调用变量 i 和函数 sum 吗? 显然是不行的。如果给出了实现文件如下

#include "Demo1.hpp"

int sum(int a, int b)
{
    return a + b + i;
}

这样是不是就实现了 sum, 外部可以正常调用啦! 话说回来变量 i 只是声明了而已,并非定义了,程序开辟内存空间中不存在这个变量的地址和值。这个时候你调用它,肯定会导致变量未定义错误的。这个时候我们就要给变量 i 开辟内存空间。

#include "Demo1.hpp"

// 变量被定义,开辟内存空间并且设置了初始值
int i = 100;

int sum(int a, int b)
{
    return a + b + i;
}

来看 main 函数,

#include <iostream>
#include "Demo1.hpp"

// 声明一个变量,它的定义在其他文件。
extern int i;

int main(int argc, const char * argv[]) {
    using std::cout;
    using std::endl;
            
    cout << "add 3 2: " << sum(3, 2) << endl;
    cout << "i: " << ++i << endl;
    
    return 0;
}

那到底解决什么问题呢?

在某些情况下,需要共享全局变量,这个变量在别的文件中被定义。