头文件中的函数定义(c使用gcc)

时间:2013-12-31 08:38:20

标签: c gcc

我正在编写一个简单的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

再次感谢!!

3 个答案:

答案 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"

修复

  1. 将静态函数定义移动到ct.c,删除单词static
  2. 将ct.h中的所有原型从static更改为extern
  3. 将ct.c添加到您的链接。
  4. 编辑:只提供ct.h

    1. 将ct.h中的所有原型从static更改为extern
    2. 在第一个函数体之前添加#ifdef __CT_C __
    3. 在最后一个函数之后,添加#endif
    4. 告诉用户在包含main的代码中,他们需要#define __CT_C__才能#include“ct.h”
    5. #include“ct.h”的任何其他内容都不得定义__CT_C __。

答案 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文件。