我正在编写一个简单的c测试框架。为简单起见,我只提供一个头文件(包含所有函数定义),但我遇到了一些问题。如果我只包含一次标题,一切正常。如果我包括两次标头,gcc链接器报告重复符号错误(这是正常的),所以我在标头中的每个函数中添加静态前缀。这次它可以工作,但函数在最终的二进制文件中是重复的。见下文:
[heidong@HEIDONGVM ztest]$ nm m | grep __ct_hex_dump
0000000000400904 t __ct_hex_dump
0000000000401efc t __ct_hex_dump
是否有某种方法使函数只定义一次?
非常感谢!!
也许有人需要代码,我刚刚在github上开始了一个项目:https://github.com/buf1024/test
再次感谢!!
答案 0 :(得分:2)
你所拥有的是ct.h
static functions
static function definitions
在atest.c中
// This is the first lot of definitions
#include "ct.h"
在main.c中
// This is the second lot of definitions
#include "ct.h"
修复
编辑:只提供ct.h
答案 1 :(得分:0)
使用编译器指令。
#IFNDEF MYFUNC
#DEFINE MYFUNC
myfunc();
#ENDIF
每次编译器命中该指令时,只有在未定义MYFUNC时它才会进入一次,并且在定义它之后,它将不会再次进入语句。无论您包含头文件多少次,它都会检查它是否已经定义过。
Coppiler指令不是编译代码的一部分。这只是一个指令。
答案 2 :(得分:0)
如果您只需要一个文件,则可以使用预处理器执行此操作:
<强> header.h 强>
#ifndef HEADER_H
#define HEADER_H
#ifdef IMPLEMENT
#undef IMPLEMENT
void func(void) {
...
}
#else
void func(void);
#endif
#endif
在一个文件中:
// Define
#define IMPLEMENT
#include "header.h"
在其他文件中:
// Only declarations
#include "header.h"
虽然我会选择一个合适的.c文件。