词汇目录
- 前言
- 一、声明,定义,初始化,赋值之间的区别?
- 使用场景
- 为啥不能在头文件中定义变量?
- 1.helloworld.h(头文件)
- 2.helloworld.cpp(执行文件)
- 二、预编译,编译,汇编,链接之间的区别?
- 1.如果看到这些流程的操作?
前言
提示:经常听不懂他们讲述的教程,其实是因为你没有听懂这里面词汇的区别:
一、声明,定义,初始化,赋值之间的区别?
在日常的教程中常说一些词汇,但是没有解释他的意思,今天清晰解释他们各自的意思
词汇 | 区别 |
---|---|
声明 | 声明说明了变量的名字和类型,但并不分配存储空间。 |
定义 | 定义也说明了变量的名字和类型,而且还为它分配了存储空间。不填充初始值 |
初始化 | 定义也说明了变量的名字和类型,而且还为它分配了存储空间。并填充初始值 |
赋值 | 对于已经定义的值初始化的值进行再次赋予更改的过程,只对于已经分配内存的变量,可以多次进行 |
注意:声明可以执行多次,但是定义只能执行一次,就是初始化只能执行一次,赋值也可以执行多次
使用场景
在我们使用C++编译器进行开发程序时,编译器会将一个个对应的头文件和执行文件通过编译成为一个个OBJ文件,然后在通过链接器link成我们熟悉的exe文件,最后我们在打开exe文件执行程序。
而在这个过程中我们就可以解释为啥要用这四个词汇(说明一下:C++支持分离式编译,把声明和定义区分开来,一些其他语言不做严格分区)
词汇 | 区别 |
---|---|
声明 | 在编写程序的过程中在头文件进行变量的具体类型书写,但不对其进行=等操作,但可能编译器自己也有对其进行=0初始化操作,纯粹的声明无定义只需要在变量前加入extern进行修饰 |
定义 | 在声明的时候,系统也为他分配了存储空间,但是没有在空间中添加值 |
初始化 | 一般在编写程序时,因为初始化=定义+初始化值,所以都是直接在CPP文件中构建函数里面初始化使用的 |
赋值 | 在构建函数中使用完后通过其他函数调用或者自己更改进行多次更换变量内存中值的操作 |
为啥不能在头文件中定义变量?
可以在头文件中去定义变量,但是因为很多的CPP文件中都会去包括头文件,这个时候就会发生一件事情:这个变量在很多CPP文件中都存在一个副本,在我们连接生成exe的阶段,就会发现有多个相同变量名的变量,会报错。更不能在头文件中进行初始化,原因一样。所以一般拿来进行变量声明,函数声明,结构体声明,宏定义等。
1.helloworld.h(头文件)
代码如下(示例):
#pragma once
#include <windows.h>
#include <iostream>
using namespace std;
/**-------只是在头文件中int就是声明-----*/
int s;
/**-------extern int 单纯的声明-没有定义。定义就在cpp中取一样的名字进行定义。如int ss=1;*/
extern int ss;
/**-------在头文件中进行声明定义初始化,可以这样做,坏处就是每个人包括这个头文件都会给他创建内存空间到时报错-----*/
int sss = 1;
/**--------当extern被赋予初始值后其实他的作用和上面的sss已经是一样的了,只是写法不同而已,也不建议*/
extern int ssss = 1;
class MyClass
{
public:
MyClass();
~MyClass();
private:
};
2.helloworld.cpp(执行文件)
代码如下(示例):
#include "helloworld.h"
//包括头文件进行定义和初始化;
MyClass::MyClass()
{
/**----给int s进行定义和初始值-----**/
s = 1;
/**----给extern int ss进行定义和初始化---*/
int ss = 1;
}
MyClass::~MyClass()
{
}
二、预编译,编译,汇编,链接之间的区别?
词汇 | 区别 |
---|---|
预编译 | 展开头文件/宏替换/去掉注释/条件编译,就是对#符号命令的解析 (.i) |
编译 | 检查语法,生成汇编 (.s) |
汇编 | 汇编代码转换机器码 就(.obj) |
链接 | 链接到一起生成可执行程序(.exe) |
1.如果看到这些流程的操作?
其中编译可以通过debug模式通过断点的方式鼠标右键进行反汇编看到内部的汇编代码,但是这些正常不涉及到底层开发的程序员其实用不到
而汇编转机器码的操作你可以通过在规定好自己的中间目录,然后编译后看到对应的文件:
项目-属性-中间目录-进行设置