1.问题缘起
小白博主头一次开始写一个目测要上千行的代码project,为了简洁,开始接触头文件的编写。
而头文件可以用一行来代替众多的宏定义,常量、函数等等的全局声明,自然是简洁风的不二之选啦!
但当我添加到第二个我自定义的头文件时,编译器开始报错如下:
implicit declaration of function…[-Wimplicit-function-declaration]
这让我百思不得其解,因为第一个头文件已经添加成功,第二个怎么就有问题了呢?
2.解决
我在stackoverflow上最终找到了一个汇总的帖子,如下:
https://stackoverflow.com/questions/44025479/implicit-declaration-of-functions-regardless-of-header-include-and-ifndef
(如果你不想看英文的话,可以接着往下看呵)
我犯的错误(也可能是许多和我一样的初学者犯的错误),就是:
了解到为了防止重复定义,所以在头文件中机智的加了
#ifndef
#define
#endif
这个结构,以为就未雨绸缪了
但是!!!如果你在#ifndef 和#define 后面什么都不加,或者在所有自定义头文件中都加相同的“标识符”的话,那么除了第一个文件会添加成功,之后的头文件都会被编译器默认是重复定义!!!所以会提示报错找不到
因为这个“标识符”就相当于一个特别的标记,标记后面的内容是否已经被定义过
3.正确的做法
正确的做法就是,在不同的头文件中添加不同的“标识符”,这样才会使上面提到的那个结构发挥作用
关于这个“标识符”的常见命名规则和上述结构更具体的介绍,请见另一位博主的帖子:
https://blog.csdn.net/DLUTBruceZhang/article/details/8723342
4.后记
实践中另外还发现,上述这种结构只是保证在同一个.c源文件中不被重复定义,但当同一个这样的头文件在不同的源文件中引用时,并不会被报错