#include在C语言中,算是预编译指令(preprocessing directive)范畴,而预编译指令在C语言就是一个大学问了。
但是,我们先不要被这个“预编译指令”名称绕晕。上文,我们提到了头文件这个概念,当然我们也知道还有一个叫源文件的概念。这些我就不解释了。但是,在C99标准中有一段这样的话,需要研究下:
A source file together with all the headers and source files included via the preprocessing directive #include is known as a preprocessing translation unit. After preprocessing, a preprocessing translation unit is called a translation unit.
ISO/IEC 9899:1999 (E)
简单地理解,一个source file和一些由#include包含着的headers和source files,通过预编译后,变成一个叫translation unit的东西。
从这里可以看出来,#include不但可以包含headers,还可以包含source files。
所以,我下面这个#include "add.h"和#include "minus.c"都是正确的,编译一点问题都没有。
// main.c
#include "add.h"
#include "minus.c"
int add(int a, int b)
{
return a+b;
}
int main(void)
{
int c = add(1,2);
int d = minus(2-1);
return 0;
}
不妨将脑洞开大一点,除了*.h和*.c文件,我还可以include点别的么?答:可以。例如
// main.c
#include "multiply.txt"
int main(void)
{
int e = multiply(2,2);
return 0;
}
甚至,这样也行
// main.c
#include "devide.fxxk"
int main(void)
{
int f = devide(2,2);
return 0;
}
继续啊,#include不是放在文件上方,放中间行么。当然
// main.c
int main(void)
{
#include "squel.xx"
int g = squel(2,2);
return 0;
}
好家伙,这么下去,我是不是可以这么干
// data.txt
1,2,3,4,5,6,7,8,9
// main.c
int arr[] =
{
#include "data.txt"
}
int main(void)
{
return 0;
}
然后,你又好奇了,能不能将data.txt换成二进制形式的data.bin?
呵呵,这种不行,编译器在预编译阶段只认得是text文本才行。
好吧……
你不是说这是个预编译指令吗,我很好奇,#include预编译后成啥样子的? |