c++:定义与声明的关系

为了支持 分离式编译(separate compilation) 机制,C++ 语言将声明和定义分开来,声明(declaration) 使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明;而定义(definition) 负责创建与名字关联的实体。

如果要在多个文件中使用同一个变量,就必须将声明和定义分离。

声明规定了变量的类型和名字,在这一点上定义与之相同。但是除此之外,定义还要申请存储空间,也可能会为变量赋一个初始值。

如果声明一个变量而非定义它,就在变量前面加关键字extend,而且不要显示的初始化变量。

extern int i; #声明i而非定义i
int j;#声明并定义j

任何包含了显式初始化的声明即成为定义。我们能给由 extern 关键字标记的变量赋一个初始值,但是这么做也抵消了 extern 的作用,extern 语句如果包含初始值就不再是声明,而变成定义了

extern int i = 0; #定义

但是只有当 extern 声明位于函数体外部时,才可以被显式初始化。在函数体内部,如果试图初始化一个由 extern 关键字标记的变量,将引发错误。

变量只能被定义一次,但是可以被多次声明。

如果要在多个文件中使用同一个变量,就必须将声明和定义分开。

调用另一个文件里面的函数:

//student.h
class Student {
public:
    const char *name;
    int age;
    float score;
    void say();
};
//student.cpp
#include <iostream>   //std::cout、std::endl
#include "student.h"  //Student
void Student::say() {
    std::cout << name << "的年龄是" << age << ",成绩是" << score << std::endl;
}
//main.cpp
#include "student.h"  //Student
int main() {
    Student *pStu = new Student;
    pStu->name = "小明";
    pStu->age = 15;
    pStu->score = 92.5f;
    pStu->say();
    delete pStu;  //删除对象
    return 0;
}

编译:# g++ main.cpp student.cpp -o student.exe

调用另一个文件里面的变量:

https://blog.csdn.net/qq_27664167/article/details/82859852

//student.cpp
int a = 0;

//main.cpp
#include <iostream>
extern int a;
int main() {
    std::cout<< a <<std::endl;
    return 0;
}

需要调取其他文件的全局变量时:extern int a;

显式的说明了a的存储空间是在程序的其他地方分配的,在文件中其他位置或者其他文件中寻找a这个变量。

第二种方法:

例如a.c文件中定义int a = 5和一个函数,在a.h里写extern int a;,如果要在其他文件里调用a这个变量和函数,直接#include<a.h>即可。

不建议在.h文件中int a = 0;,因为当多个文件包含该头文件的时候,#include相当于复印了一份代码,就会导致变量重复定义,变量只能定义一次。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值