一、源文件如何根据#include来关联头文件
1,系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。
#include <xxx.h>
2,用户自定义的文件用双引号括起来,编译器首先会在用户目录下查找,然后在到C++安装目录(比如VC中可以指定和修改库文件查找路径,Unix和Linux中可以通过环境变量来设定)中查找,最后在系统文件中查找。
#include “xxx.h”
二、头文件如何来关联源文件
这个问题实际上是说,已知头文件“a.h”声明了一系列函数,“b.cpp”中实现了这些函数,那么如果我想在“c.cpp”中使用“a.h”中声明的这些在“b.cpp”中实现的函数,通常都是在“c.cpp”中使用#include “a.h”,那么c.cpp是怎样找到b.cpp中的实现呢?
其实.cpp和.h文件名称没有任何直接关系,很多编译器都可以接受其他扩展名。比如偶现在看到偶们公司的源代码,.cpp文件由.cc文件替代了。
在Turbo C中,采用命令行方式进行编译,命令行参数为文件的名称,默认的是.cpp和.h,但是也可以自定义为.xxx等等。
谭浩强老师的《C程序设计》一书中提到,编译器预处理时,要对#include命令进行“文件包含处理”:将file2.c的全部内容复制到#include “file2.c”处。这也正说明了,为什么很多编译器并不care到底这个文件的后缀名是什么----因为#include预处理就是完成了一个“复制并插入代码”的工作。
编译的时候,并不会去找b.cpp文件中的函数实现,只有在link的时候才进行这个工作。我们在b.cpp或c.cpp中用#include “a.h”实际上是引入相关声明,使得编译可以通过,程序并不关心实现是在哪里,是怎么实现的。源文件编译后成生了目标文件(.o或.obj文件),目标文件中,这些函数和变量就视作一个个符号。在link的时候,需要在makefile里面说明需要连接哪个.o或.obj文件(在这里是b.cpp生成的.o或.obj文件),此时,连接器会去这个.o或.obj文件中找在b.cpp中实现的函数,再把他们build到makefile中指定的那个可以执行文件中。
在Unix下,甚至可以不在源文件中包括头文件,只需要在makefile中指名即可(不过这样大大降低了程序可读性,是个不好的习惯哦^_^)。在VC中,一帮情况下不需要自己写makefile,只需要将需要的文件都包括在project中,VC会自动帮你把makefile写好。
通常,编译器会在每个.o或.obj文件中都去找一下所需要的符号,而不是只在某个文件中找或者说找到一个就不找了。因此,如果在几个不同文件中实现了同一个函数,或者定义了同一个全局变量,链接的时候就会提示“redefined”。
文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/20090403/163909.html)
分享到:
相关推荐
源文件与头文件的关系 源文件和头文件是C++编程语言中的两个基本组成部分,它们之间存在着紧密的关系。本文将详细介绍源文件如何根据#include来关联头文件,头文件如何来关联源文件,以及它们之间的关系。 一、...
这种情况是指多个文件中定义了同名的全局变量,例如: a 文件中:int s = 0; class a{ }; b 文件中:int s; class b{ }; 这种情况下,编译器将会报错,因为它不知道该选择哪个定义。 解决方法 解决这种冲突的...
如果一个头文件被多个源文件包含,或者在一个源文件中被多次包含,则会导致不必要的重复和潜在的编译错误。 **解决方法:** 为了避免重复包含头文件,通常采用以下两种方法之一: 1. **使用预处理指令**:通过`#...
在C++编程中,函数重载(Overload)是一种强大的特性,它允许我们在同一个作用域内定义多个同名但参数列表不同的函数。然而,C语言并不支持这种特性,因此开发者通常需要通过其他方法来实现类似的功能。"cpp-crh...
- 头文件通常与源文件同名,如`LCD.h`对应`LCD.c`,以便清楚地识别接口和实现的关系。 6. **typedef的使用**: - `typedef`用于创建新的类型别名,如`typedef unsigned int uint;`。虽然方便,但在某些情况下可能...
变量重复定义是指在不同的源文件中定义了同名的变量,这将导致编译器无法区分这些变量,从而导致编译错误。例如,在test-1.0中,我们定义了变量i,在test.h中声明了变量i,但是在test.c中又重新定义了变量i,这将...
- **头文件包含管理**:谨慎管理头文件的包含关系,避免不必要的包含,减少潜在的冲突。 通过以上方法,可以有效地解决混合编程中的头文件问题,使得C、C++和Objective-C能够和谐共存,同时保证代码的可读性和可...
这类问题通常源于项目中多个源文件共享相同的头文件(.h文件),而这些头文件中包含了某些全局变量或函数的定义。 #### 二、错误分析 根据文中描述的情况,错误出现在了两个不同的C文件中:`LCD.C`和`MAIN.C`。这两个...
首先,让我们明确一点:在头文件中定义`const`变量的主要目的是为了在多个源文件之间共享这些不可修改的值。这样做可以确保这些值在整个程序中保持一致,避免了重复定义和数据不一致的风险。例如,你可以用`const`来...
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。在同一个函数内可以定义多个同名的局部变量,每个局部变量的作用域就在那个循环体内。 二、extern关键字 extern...
3. 全局变量在头文件中的定义:全局变量可以在头文件中定义,但为了防止在多个源文件中重复定义,通常在头文件中使用static关键字来声明,这样全局变量就只在该头文件对应的源文件中可见。 4. for循环和while循环的...
在编程中,局部变量与全局变量的作用域是不同的,这决定了它们在程序中的使用方式及其可见性。根据题目中的描述,我们可以了解到以下知识点: #### 1. 局部变量与全局变量重名的可能性 - **可能性:** 局部变量...
1. 在objdir中生成与source相似的目录树,防止不同source目录下同名的源文件生成的obj文件相互覆盖。 2. 在编译过程中,默认显示短命令。可以通过变量设置切换为显示长命令。 3. 用户可自扩展编译规则。 =====...
- 全局变量可以定义在头文件中,但多个源文件中使用时,应以static声明,以限制其作用域在同一源文件内。 - 同名全局变量只能在一个源文件中初始化,否则链接时会出错。 4. 循环语句: - for( ; 1 ; )与while(1)...
C++编译器在编译过程中需要知道函数原型,这些原型声明通常放在头文件中,通过#include指令与源文件关联。预处理器处理#include指令,将头文件内容合并到源文件中。#include指令有两种格式,一种是尖括号,预处理器...
* 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。 平衡二叉树 * 平衡二叉树是左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于 1。 堆栈溢出 * ...
- 全局变量可以定义在头文件中,但为了避免命名冲突,可以使用`static`关键字声明,这样每个包含该头文件的源文件都会有一个独立的变量副本。 4. **for( ;1 ;)循环**: - 这种形式的for循环与`while(1)`等价,...
- 局部变量可以在同一作用域内与全局变量同名,但它们是独立的,局部变量会屏蔽全局变量。若需访问全局变量,可以使用`::`操作符。 - 局部变量的作用域仅限于定义它的函数或代码块,而全局变量在整个源文件甚至多...
- Makefile应包含所有源文件和头文件的依赖关系,以及必要的编译和链接命令。 6. **增量编译(Incremental Build)**: - make的增量编译特性使得只有改动过的源文件才会被重新编译,从而大大提高了构建效率。 -...
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比方在两个循环体内都定义一个同名的局部变量,...