C++项目相关知识#include,.h和.cpp分工

预备知识

#include 就是把另一个文件里的东西复制到当前文件,无论你的文件是. h 还是. cpp 都是一样的。
c++中我们cpp文件和.h文件的区别是,cpp文件是需要编译的文件,成为一个独立的编译单元,而h文件从来是不需要编译,只是用于预处理。
在写.h文件时,可以在文件开始处写上#pragma once,这条命令可以使同一个文件不会多次包含这个.h文件的内容了。
声明只是告诉编译器有这么一个东西,并不分配空间,定义会具体分配内存空间。


外部变量

在同一个项目里,使用默认的全局命名空间的情况下,如果在多个文件里定义同名全局变量(默认情况下,全局变量是外部变量,可以被别的文件引用),则会导致这个名称的变量的空间在不同编译单位里被分配多次,而外部变量又是可以被其他文件引用的,从而在链接时导致错误,链接器不知道哪个空间才是这个名称的变量的正确地址。
在同一个项目里,使用同一个全局变量的方式是,只在一个文件里定义这个变量,而其他需要用到这个变量的文件,可以先声明一下这个声明,然后就可以使用这个变量了。
比如在test.cpp文件里写如下代码

int a=5;//定义变量a

在main.cpp文件里写如下代码

# include
extern int a;//声明变量a
//extern相当于在和编译器说,a已经在别的地方定义了,去别的地方找它定义
int main()
{
    std::cout<

输出结果为

5

外部函数

函数的代码最后存放在虚拟内存中的.text段里,在同一个项目里,使用默认的全局命名空间的情况下,如果在多个文件里定义同名且参数一致的非成员函数(默认情况下,非成员函数是外部函数,可以被别的文件引用),则会导致这个名称的非成员函数在不同编译单位里有多个空间,从而在链接时导致错误,链接器不知道哪个空间才是这个名称的非成员函数的正确地址。
在同一个项目里,使用同一个非成员函数的方式是,只在一个文件里定义这个函数,而其他需要用到这个函数的文件,可以先声明一下这个声明,然后就可以使用这个函数了。
在test.cpp文件写如下代码

#include 
void fun(){//定义函数fun
        std::cout << "hello world" << std::endl;
}

在main.cpp写如下代码

void fun();//声明函数fun,可省略extern
int main()
{
    fun();//使用函数fun
}

输出结果

hello world

C++类的定义,其实就是声明一个类型,这个类型由哪些变量和函数组成,和我们通常所说的定义不一样,可以把它理解为变量的声明。
而C++类的实现,即定义类里面的成员函数,所以可以把C++类的实现理解为变量的定义。
而默认的全局命名空间情况下,变量是外部链接的,相似的,类也是外部链接的。
在test1.cpp内容如下

class A{
public:
    int a;
    void fun();
};

main.cpp内容如下

#include "test1.cpp"
#include 
void A::fun() {
    std::cout<<"hello world"<

输出结果

hello world

相当于在test1.cpp和main.cpp先声明了类 A,再在main.cpp里面定义这个类A(具体实现这个类A)。如果在test1.cpp里不但声明了A,还实现了A,则会造成重定义错误。


所以项目的组织方式是,需要被多个文件用到的变量声明,类的声明和函数声明放在头文件里,声明可以存放在多个不同的文件里,这些文件使用#include"*.h"来包含这些头文件。而这些变量的定义和函数定义和类的实现(可以理解为定义)在某个.cpp里实现,定义只需要定义一次。

你可能感兴趣的:(C++项目相关知识#include,.h和.cpp分工)