‘壹’ 为什么C语言头文件中要用条件编译
如果你说的是文件中避免重复包含的预处理指令,有两个原因
a)重复编译相同的内容,即使不会导致语法错误,对编译器也是极大的开销,在大工程中,绝对是不可容忍的,持续编译集成的代价是很高的,能省必须省
b) 有很多语法元素是不可重复编译的,例如类型定义。你仅仅考虑变量,是远远不够的。实际中,变量在头文件中的使用是非常少的,因为全局变量也是能避免就避免的
‘贰’ C语言头文件都是什么程序编程的会C语言了就会编头文件了吗
其实写一个C语言程序可以完全不用头文件。对#include指令,编译过程中只是在预处理阶段把包含的文件以文本形式完全替换到#include所在的那一行而已。由此可以看出,头文件内容也是编译器(在预处理之后)编译的,如果自己在源文件里面写头文件的内容,可以不用#include。学会C语言就应该会编写头文件(至于是不是有必要写则另当别论)。
头文件的内容一般是函数声明、宏、内联函数等。如果只有一个源文件,那么完全可以不用头文件(当然用现成的头文件可能比较方便)。但是在多个文件中,需要超过一次使用相同声明等代码时,照抄显然会增加维护成本(一旦一个源文件内改了还需要复制粘贴到另外的源文件中),这时候显然应该使用头文件减轻负担。这里头文件会被多个源文件包含生成多个目标文件,因此不应该在头文件中放函数和全局/静态对象的定义(而只能是声明)以免链接器产生重复定义的错误(一般也不应该在一个源文件中包含另外的源文件)。于是一般习惯以一个头文件对应一个源文件,主文件名相同以方便查看对应关系。此外,函数和对象声明可以不是对应源文件而是对应外部已经编译好的静态库文件(例如.lib),无需再次编译,C标准库就是一个例子。
====
[原创回答团]
‘叁’ c语言里include包含的文件,编译时是全部编译还是将部分用到的内容编译
在预处理时把代码全部放进去,编译时自然是全部编译,但是后期涉及到动态库的东西,其实有些函数没有真的被链接进来(只是地址而已),这些东西慢慢来吧
‘肆’ C语言代码的头文件与源文件有什么区别
头文件和源文件在本质上没有任何区别。 只不过一般:后缀为 .h 的文件是头文件,内含函数声明、宏定义、结构体定义等内容。后缀为 .c 的文件是源文件,内含函数实现,变量定义等内容。而且是什么后缀也没有关系,只不过编译器会默认对某些后缀的文件采取某些动作。这样分开写成两个文件是一个良好的编程风格。
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:
①预处理阶段
②词法与语法分析阶段
③ 编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各 个目标文件 (.obj文件)
④连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关 的可执行文件,当然,最后还可以用obj生成纯二进制码,也就是去掉了文件格 式信 息。(生成.exe文件)
3.比方说 在aaa.h里定义了一个函数的声明,然后在aaa.h的同一个目录下建立aaa.c , aaa.c里定义了这个函数的实现,然后是在main函数所在.c文件里#include这个aaa.h 然后我就可以使用这个函数了。 main在运行时就会找到这个定义了这个函数的aaa.c文件。这是因为:main函数为标准C/C++的程序入口,编译器会先找到该函数所在的文件。假定编译程序编译myproj.c(其中含main())时,发现它include了mylib.h(其中声明了函数void test()),那么此时编译器将按照事先设定的路径(Include路径列表及代码文件所在的路径)查找与之同名的实现文件(扩展名为.cpp或.c,此例中为mylib.c),如果找到该文件,并在其中找到该函数(此例中为void test())的实现代码,则继续编译;如果在指定目录找不到实现文件,或者在该文件及后续的各include文件中未找到实现代码,则返回一个编译错误.其实include的过程完全可以“看成”是一个文件拼接的过程,将声明和实现分别写在头文件及C文件中,或者将二者同时写在头文件中,理论上没有本质的区别。以上是所谓动态方式。对于静态方式,基本所有的C/C++编译器都支持一种链接方式被称为Static Link,即所谓静态链接。在这种方式下,我们所要做的,就是写出包含函数,类等等声明的头文件(a.h,b.h,...),以及他们对应的实现文件(a.cpp,b.cpp,...),编译程序会将其编译为静态的库文件(a.lib,b.lib,...)。在随后的代码重用过程中,我们只需要提供相应的头文件(.h)和相应的库文件(.lib),就可以使用过去的代码了。相对动态方式而言,静态方式的好处是实现代码的隐蔽性,即C++中提倡的“接口对外,实现代码不可见”。有利于库文件的转发.
‘伍’ 关于C语言的头文件的问题,这个头文件是怎么进去的,需要自己写还是编译器做的
头文件编译器会自带一些的,这些我们大部分都已经足够使用了。
但有时候我们需要自己写一些定义,比如函数的申明,全局变量的申明。这样就可以自己建一个头文件。然后在代码里面添加进去就可以了。
‘陆’ 关于c语言头文件编译和运行的问题
1、只要在程序开头加入#include<头文件名>,在编译过程当中,头文件自动会被添加到源文件当中一起进行编译。
2、编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。
C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件。
‘柒’ C语言,头文件不包含也能编译通过
turbo
c
2.0编译系统中如果用到输入输出函数是可以不写,用到其他函数就要写对应得头文件,但是turbo
c
3.0中都要写。
你最好是写起嘛,这是一种规范,反正又不累!
‘捌’ c语言,头文件问题,和编译问题
如果只是刚开始学习C语言就不要深究这些了,你所问问题的答案是编译器和连接器的工作原理。
如果真心想知道,就去看一本书,名叫 深入理解计算机系统 。里面有更全面更深入的讨论。
‘玖’ 关于c语言的头文件问题
如果定义了__STDC__,就说明这个编译器遵循标准C。所以把_Cdecl定义为空字符串,也就是相当于把所有的_Cdecl删除了。
如果没有定义__STDC__,就是明这个编译器不遵循标准C。那么把_Cdecl定义为 cdecl。
其实cdecl可能也是一个宏,当编译器支持一个叫“调用约定”的扩展时,cdecl被定义成这种扩展的语法。
之所以有这段条件编译是因为标准C不支持“调用约定”。
‘拾’ C语言编译出现的头文件问题
额,你有把那个头文件iterator.h'添加到你的文件夹中么,没有的话就会报这个错误的