`

头文件与同名源文件的关系

    博客分类:
  • C++
阅读更多
一、源文件如何根据#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来关联头文件,头文件如何来关联源文件,以及它们之间的关系。 一、...

    关于c++头文件冲突那点事(csdn)————程序.pdf

    这种情况是指多个文件中定义了同名的全局变量,例如: a 文件中:int s = 0; class a{ }; b 文件中:int s; class b{ }; 这种情况下,编译器将会报错,因为它不知道该选择哪个定义。 解决方法 解决这种冲突的...

    防止变量重复定义、头文件重复包含、嵌套包含

    如果一个头文件被多个源文件包含,或者在一个源文件中被多次包含,则会导致不必要的重复和潜在的编译错误。 **解决方法:** 为了避免重复包含头文件,通常采用以下两种方法之一: 1. **使用预处理指令**:通过`#...

    cpp-crh只有一个头文件用于C的实时重载解决方案

    在C++编程中,函数重载(Overload)是一种强大的特性,它允许我们在同一个作用域内定义多个同名但参数列表不同的函数。然而,C语言并不支持这种特性,因此开发者通常需要通过其他方法来实现类似的功能。"cpp-crh...

    单片机模块化编程[文].pdf

    - 头文件通常与源文件同名,如`LCD.h`对应`LCD.c`,以便清楚地识别接口和实现的关系。 6. **typedef的使用**: - `typedef`用于创建新的类型别名,如`typedef unsigned int uint;`。虽然方便,但在某些情况下可能...

    防止变量重复定义、头文件重复包含、嵌套包含[定义].pdf

    变量重复定义是指在不同的源文件中定义了同名的变量,这将导致编译器无法区分这些变量,从而导致编译错误。例如,在test-1.0中,我们定义了变量i,在test.h中声明了变量i,但是在test.c中又重新定义了变量i,这将...

    c c++ objective-c 混合编程 头文件问题

    - **头文件包含管理**:谨慎管理头文件的包含关系,避免不必要的包含,减少潜在的冲突。 通过以上方法,可以有效地解决混合编程中的头文件问题,使得C、C++和Objective-C能够和谐共存,同时保证代码的可读性和可...

    关于IAR中摸个“xxx”在两个module中redefined的error问题

    这类问题通常源于项目中多个源文件共享相同的头文件(.h文件),而这些头文件中包含了某些全局变量或函数的定义。 #### 二、错误分析 根据文中描述的情况,错误出现在了两个不同的C文件中:`LCD.C`和`MAIN.C`。这两个...

    C语言在头文件中定义const变量详解

    首先,让我们明确一点:在头文件中定义`const`变量的主要目的是为了在多个源文件之间共享这些不可修改的值。这样做可以确保这些值在整个程序中保持一致,避免了重复定义和数据不一致的风险。例如,你可以用`const`来...

    C语言面试题大汇总之华为面试题:1、局部变量能否和全局变量重名;2、如何引用一个已经定义过的全局变量;3、全局变量可不可以定义在可被多个.C文件包含的头文件中 为什么;4、语句for( ;1 ;)有什么问题 它是什么意思……

    局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。在同一个函数内可以定义多个同名的局部变量,每个局部变量的作用域就在那个循环体内。 二、extern关键字 extern...

    深圳华为C语言面试题集.pdf

    3. 全局变量在头文件中的定义:全局变量可以在头文件中定义,但为了防止在多个源文件中重复定义,通常在头文件中使用static关键字来声明,这样全局变量就只在该头文件对应的源文件中可见。 4. for循环和while循环的...

    [面试/笔试系列3]局部变量能否和全局变量重名

    在编程中,局部变量与全局变量的作用域是不同的,这决定了它们在程序中的使用方式及其可见性。根据题目中的描述,我们可以了解到以下知识点: #### 1. 局部变量与全局变量重名的可能性 - **可能性:** 局部变量...

    通用makfile

    1. 在objdir中生成与source相似的目录树,防止不同source目录下同名的源文件生成的obj文件相互覆盖。 2. 在编译过程中,默认显示短命令。可以通过变量设置切换为显示长命令。 3. 用户可自扩展编译规则。 =====...

    2013笔试题目总结

    - 全局变量可以定义在头文件中,但多个源文件中使用时,应以static声明,以限制其作用域在同一源文件内。 - 同名全局变量只能在一个源文件中初始化,否则链接时会出错。 4. 循环语句: - for( ; 1 ; )与while(1)...

    C++基础经典速成教程

    C++编译器在编译过程中需要知道函数原型,这些原型声明通常放在头文件中,通过#include指令与源文件关联。预处理器处理#include指令,将头文件内容合并到源文件中。#include指令有两种格式,一种是尖括号,预处理器...

    C语言终极面试宝典.doc

    * 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。 平衡二叉树 * 平衡二叉树是左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于 1。 堆栈溢出 * ...

    C语言面试题大汇总之华为面试题及答案

    - 全局变量可以定义在头文件中,但为了避免命名冲突,可以使用`static`关键字声明,这样每个包含该头文件的源文件都会有一个独立的变量副本。 4. **for( ;1 ;)循环**: - 这种形式的for循环与`while(1)`等价,...

    华为C语言面试题

    - 局部变量可以在同一作用域内与全局变量同名,但它们是独立的,局部变量会屏蔽全局变量。若需访问全局变量,可以使用`::`操作符。 - 局部变量的作用域仅限于定义它的函数或代码块,而全局变量在整个源文件甚至多...

    GNU make 指南

    - Makefile应包含所有源文件和头文件的依赖关系,以及必要的编译和链接命令。 6. **增量编译(Incremental Build)**: - make的增量编译特性使得只有改动过的源文件才会被重新编译,从而大大提高了构建效率。 -...

    C语言面试题及答案.doc

    局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比方在两个循环体内都定义一个同名的局部变量,...

Global site tag (gtag.js) - Google Analytics