C语言中,定义自定义库函数时该如何写对应的头文件

我想写个自己的库函数以便在源码开头用#include "XXX.h"调用。
我目前完成的一个包含库函数的C文件中的函数需要stdio.h, stdlib.h和string.h的函数。因此我在相应的头文件中将这三个标准库include了。结果编译时出现了“重复定义”的报错。
我知道这是由于main中也include了stdio.h和stdlib.h,这两个库被include了两遍。因此我查看了编译器目录下的标准库头文件,但由于不懂那些带下划线的标准宏是什么意思,没太看懂。但我看它的大致思路是条件编译。
希望有这方面经验的诸位给我做个示范,我不想麻烦大家,只要帮我讲一下该如何在头文件中include <stdlib.h>,举个例子,剩下的部分我照葫芦画瓢就好了。多谢!

没有强制规定,但一般遵循以下原则:

1 功能类似或相关的一组函数写在同一个头文件中;
2 头文件命名应简单,尽量短,但可以通过文件名得知内部函数功能;
3 头文件名由数字、字母、下划线组成,不要有空白字符或其它符号;
4 为防止头文件重复引用,或嵌套引用,头文件应使用条件编译包含;
5 头文件中,应遵循先类型定义,后函数声明的顺序;
6 当头文件函数声明中,用到其它头文件中定义的类型时,在头文件开始处进行引用。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-08-13

首先,要明白一点。标准库的头文件多次include是不会发生重定义的错误的。所有的标准库文件的内容都是如这般写的:

#ifndef STDLIB_H
#define STDLIB_H
...
#endif

这保证了它的内容只会被引用一次。所以要include,只写一句

#include <stdlib.h>

就可以了。


另外,你自己的头文件最好也加上上面所示的那种保卫宏,以防多次引用你自己的头文件出现重定义。


你说的重复定义,可能是另外一个问题。你说你自己做了一个库,如果你是用 Visual C 建工程生成的 lib 库文件,要注意项目属性里有一个 ”/Mt“ "/Md" 的选项。请保证选的是后者,否则你的库文件中会有一套标准库的函数的实现,而使用你的库编译其他程序的时候,又会再次连接系统库,如此便会产生重定义。

追问

第2个回答  推荐于2018-02-28
#include "MyHead.h"
来包含。
头文件是不编译的,因为C语言编译过程之前有个预编译过程。在这个过程中用头文件中的内容替换源文件中“#include”命令,所以在编译器看来,没有头文件,只有源文件。预编译过程还包括条件编译。
头文件为了防止被重复包含,通常的格式是:
/* MyHead.h */
#ifndef _MYHEAD_H_
#define _MYHEAD_H_
(这里是头文件的内容)
#endif /* _MYHEAD_H_ */
希望对你有帮助!追问

如果函数源文件中需要调用库函数,该如何处理?
我看标准库头文件中常有这样的话:
#ifndef RC_INVOKED
#include
#endif /* NOT RC_INVOKED */

这是什么意思?我需不需要包含类似的语句?多谢

追答

这是一般的格式,最好还是加上

本回答被提问者和网友采纳
第3个回答  2014-08-13
跟标准库的头没关系,标准库的头文件随便你包含多少次都不会有问题的。
你把报错的提示给贴上来吧。
相似回答