首页 > 代码库 > 瞎折腾--#include到底是什么意思

瞎折腾--#include到底是什么意思

很多人上了这么多年学,学了这么多年课,考了这么多年试,写了这么多年程序,到头来,问问你#include是什么意思,却只能简单的说说那是一个预处理命令。然后在深问一下,什么是预处理命令,然后就卡壳了。下面我们就来一起瞎折腾一下,看看#include背后的故事。

一般来说,我们都是#include <stdio.h>的,但是今天我不这样写。

先看看我的工程,我的Project中有三个文件,main.cpp ,Foo.txt, Foo.c。这里要看清楚了,我没有使用Foo.h,而是使用了Foo.txt。好了,废话不说了,先来看看Foo.txt里面的内容。

/*
*FileName: Foo.txt,NOT Foo.h
*/

#ifndef foo_txt_
#define foo_txt_

#ifdef __cplusplus
extern "C"{
#endif

#define NUMBER (1+1*1)
int Foo(void);

#ifdef __cplusplus
}
#endif

#endif //all the file 

这是头文件,只是简单的声明了一下Foo这个函数。这个函数没有参数,有一个int类型的返回值。并且定义了一个宏。这个宏就是Foo的返回值。

下面看Foo.c,这个源文件只是简单的实现了Foo。下面是代码:

#include "Foo.txt"

int Foo(void)
{
	return NUMBER;
}

最后一个文件是main.cpp,这个文件里面包含了main函数,简单的调用了一下Foo这个函数。下面是main.cpp的源代码:

#include <iostream>
#include "Foo.txt"

using namespace std;
int main()
{
	cout<<Foo()<<endl;
	return 0;
}

好了,代码已经写完了,下面我们使用g++来编译一下,当然,你也可以使用任何编译器来编译这段代码,我使用的是g++,具体其他的编译器的方法大同小异:

g++ -Wall main.cpp foo.c -o main.exe

好了,无错误,无警告。运行正确,在控制台上输出了2:下面是截图:


其实#include只是简单的复制了头文件中的内容一次到源文件中。我们可以使用cpp命令来看看经过处理后的Foo.c。使用gcc输入:

cpp foo.c >foo.i

经过处理之后的文件如下:

# 1 "Foo.c"
# 1 "<command-line>"
# 1 "Foo.c"
# 1 "Foo.txt" 1
# 13 "Foo.txt"
int Foo(void);
# 2 "Foo.c" 2



int Foo(void)
{
 return (1+1*1);
}

从上面Foo.i的文件中可以看出,#include只是将该复制的复制(函数的声明),该替换的替换(宏定义)。并没有做大多的处理。

好了,今天的解释就到这了,希望看完之后能够明白几个问题:

1.有关某些渣渣教科书喜欢#include "XXX.c",这样编译器却不会报错,但是不是一种好的方法。

2.问什么要在头文件的前面加上#ifndef。

3.为什么不能再头文件中给声明变量并赋值,例如:int number=10;






瞎折腾--#include到底是什么意思