C/c++编译器如何看待h和cpp文件

来源:互联网 发布:青少年行知实践园在哪 编辑:程序博客网 时间:2024/05/20 02:53

h头和cpp文件都是源码文件,代码可以在h中也可以在cpp中

#include 相当于包含 ,h中的代码会被包含进#include 它的cpp文件中, #pragma 表示只include一次,

通常 h只有声名满程序include 来使用,使cpp是实体一内有函数和变量实体,一般不

h头是声名使用 ,分继承头和使用头,继承头必须加一子类h头中,使用头必须加在cpp文件中(采用的是错乱交织形态include进去)

Cpp为定义和使用程序实体 一个CPP文件生成一个obj链接文件,会把h中的代码一起编译生成obj。 class struct下可有代码 相当于定义。 编译器只根椐cpp文件去生成obj,后链接

生成dll /exe ocx等二进制文件。

若h中有多个实体代码 h被多个cpp  include进入便会在多个obj文件中包含 出现link 2005错误

 

编译以cpp为单位,h头可有代码实体也可以为声名(不过最好是声名) cpp文件 不依赖于h头而存在,C/C++以CPP文件为主,h头只是附代用来声明,CPP 或C相当于 java中的

java C#中的cs文件,java和C#不用用户自己声名,import 和using会生成声名并且不会重复import/using   CC++通过 #pragma once保证在同一个文件中不会重复包含头文件

但是不同的CPP中可以包含同一个头文件,若头文件中有定义也会编译成obj文件,当链接时发生link 2005错误

#pragma once  仅相对于同一个CPP文件,#inlude不重复包含 头文件。

 

应用中的常量解决方案 constant.h声明,constant.cpp是定义

 

与stdafx.h  和stdafx.cpp 相似, VS2010 有些独立的CPP

 

h中用宏定义反回消息值

 

汇编 和 C/C++ 中有预编译  宏定义 

 

java 中无预编译

 

C#中也有预编译

 

 CC++中的依赖树关系

编译原理:h头声明 cpp为定义实体 一个cpp对应一个obj ,生成的obj 链接生成 lib  dll(有限个接口) exe (有入口的程序)可直接运行)

link 重复 为在 两个CPP中定义同一个变量

lib文件lib依赖树关系

CPP 完整link成lib文件,可以就lib是cpp的结合体,lib中不能定义相同的变量

   #pragma  comment(lib,"libcmt.lib")
   #pragma  comment(lib,"msvcrt.lib")
  

lib中不链接入lib文件,只有lib链接语句,

两个lib中同时lib同一个lib会重复吗 lib中可以链接新的lib进入,lib只是cpp写的代码 不进行链lib文件的包含链接入自身中,


(vs2010)#pragma lib不会重复加载lib 

dll文件

dll也有lib,lib中只有dll的声明,dll实体被单独load进入内存,(lib被包括进入可执行程序)lib要link生成obj

dll和可执行都是相互独立互不干扰,属于运行实体

lib是纯正的类库体,所有的lib静态库不能重复定义