c++ 中头文件

头文件

在c++中,我们经常需要调用各种函数、对象、结构体。例如我们写一个最简单的两个数字相加的的函数,文件名称为int_plus.cc:

int int_plus(const int a, const int b){
    return a + b;
}

那么我们怎么在主程序中调用它呢?我们只需要在主程序中定义一个同名的函数就行,在编译时,会把各个.cc文件全部编译成二进制,然后通过函数名链接起来。

int int_plus(const int a, const int b);

int main()
{

    int a = 3;
    int b = 4;
    int c = int_plus(a,b);
    std::cout << c << std::endl;
    return 0;
}

这里说一个重要的结论:

这种调用方法是唯一的方法!

这种调用方法是唯一的方法!

这种调用方法是唯一的方法!

但实际写代码时,我们可能会调用非常多的函数,同一个函数也可能被不同的代码反复调用,每次调用我们都写一个同名函数不仅繁琐而且容易出错。那么有没有什么办法写简单一些呢?有,用头文件。

头文件是一个给出函数,对象、结构体的定义的文件,一般不在头文件中写具体的逻辑代码。

在上面的例子中,我们定义一个头文件int_plus.h,代码是:

int int_plus(const int a, const int b);

我们在调用相关的函数时,只需要写上:

#include "int_plus.h"

int main()
{

    int a = 3;
    int b = 4;
    int c = int_plus(a,b);
    std::cout << c << std::endl;
    return 0;
}

需要注意的是,对于c++自有的模块,一般用尖括号,写成

#include <string.h>

#include 是一个宏表达式,在预编译阶段,会把include的头文件中的所有内容复制到代码的开头。

虽然我们用了include和头文件来用于调用,但是在实际编译中,会把头文件的内容复制到代码开头,本质上还是定义了一个同名函数。所以上面说定义同名函数是唯一的方法。

一般在定义写头文件时,会使用#ifdef来定义一个宏

例如在上面的例子中,会写成

#ifndef INT_PLUS_H
#define INT_PLUS_H
int int_plus(const int a, const int b);
#endif

它的作用是为了防止重复复制,例如,我们有两个头文件int_plus.h 和 int_plus_v2.h。 其中int_plus_v2.h的代码如下:

#ifndef INT_PLUS_V2_H
#define INT_PLUS_V2_H
#include "int_plus.h"
int int_plus_v2(const int a, const int b);
#endif

在main中同时有

#include "int_plus.h"
#include "int_plus_v2.h"

如果没有定义ifdef的宏,在预编译的时候会导致int_plus.h被复制到main文件中2次,从而报错。而有了#ifdef 以后,在第二次复制的时候由于宏INT_PLUS_H已经存在,所以会认为int_plus.h文件是空的,不会重复复制。

值得一提的是,虽然头文件和源文件经常出现在一个路径下,但其实并没有这个必要。头文件是在预编译的时候用于复制函数名,而源文件则是在编译和链接环节生效。

#include <assert h>     设定插入点 #include <ctype h>     字符处理 #include <errno h>     定义错误码 #include <float h>     浮点数处理 #include <fstream h>    文件输入/输出 #include <iomanip h>    参数化输入/输出 #include <iostream h>    数据流输入/输出 #include <limits h>     定义各种数据类型最值常量 #include <locale h>     定义本地化函数 #include <math h>      定义数学函数 #include <stdio h>     定义输入/输出函数 #include <stdlib h>     定义杂项函数及内存分配函数 #include <string h>     字符串处理 #include <strstrea h>    基于数组的输入/输出 #include <time h>      定义关于时间的函数 #include <wchar h>     宽字符处理及输入/输出 #include <wctype h>     宽字符分类 int spawnvpe int mode char pathname char argv[] char envp[] spawn函数族在mode模式下运行子程序pathname 并将参数 arg0 arg1 arg2 argv[] envp[] 传递给子程序 出错返回 1 mode为运行模式 mode为 P WAIT 表示在子程序运行完后返回本程序 P NOWAIT 表示在子程序运行时同时运行本程序 不可用 P OVERLAY表示在本程序退出后运行子程序 在spawn函数族中 后缀l v p e添加到spawn后 所指定的函数将具有某种操作能力 有后缀 p时 函数利用DOS的PATH查找子程序文件 l时 函数传递的参数个数固定 v时 函数传递的参数个数不固定 ">#include <assert h>     设定插入点 #include <ctype h>     字符处理 #include <errno h>     定义错误码 #include <float h>     浮点数处理 #include <fstream h>    文件输入/输出 #include <iomanip h& [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值