c++编译运行过程
1、c++在编译时将该工程下所有.cpp文件编译为.o文件(不会编译.h文件)
2、包含头文件就是将头文件的内容复制过来
3、c++在链接阶段将所有.o文件链接为可执行文件,注意重定义问题
#pragma once预处理
保证一个源文件中只包含该头文件一次
并不能保证该工程都只包含该头文件一次
假设现在有如下关系
--------------------a.h--------------------
#pragma once
--------------------b.h--------------------
#pragma once
#include "a.h"
--------------------c.h--------------------
#pragma once
#include "a.h"
#include "b.h"
此时,c.h中只包含了一次a.h
注意:#pragma once预处理并不能保证该工程都只包含一次a.h
也就是说在链接阶段依然会存在重定义问题,比如下面
--------------------a.h--------------------
#pragma once
void test(){}
--------------------b.h--------------------
#pragma once
#include "a.h"
--------------------c.h-------------------- -----------------------c.cpp-----------------------
#pragma once #include "c.h"
#include "a.h"
#include "b.h"
-----------------------d.cpp-----------------------
#include "a.h"
这个工程在编译阶段 c.cpp和d.cpp都可以编译成功为c.o和d.o ,但是在链接阶段c.o和d.o中都定义了void test(){} 发生链接错误!