C - 构建大型项目期间函数的多重定义

时间:2015-06-13 14:36:30

标签: c

我正在尝试构建大型项目,其中包含以下头文件

error.h

#ifndef __ERROR_H__
#define __ERROR_H__

#include <stdio.h>
#include <stdlib.h>

void error_validate_pointer(void *ptr)
{
    if (ptr == NULL)
    {
        puts("Error with allocating memory");
        exit(1);
    }
}

#endif /* __ERROR_H__ */

我在每个.c文件中经常使用这个函数(我在每个文件中包含“error.h”)但我认为#ifndef会保护我免受多重定义错误的影响。然而,在构建期间,我收到以下错误:

../dictionary/libdictionary.a(state_list.c.o): In function `error_validate_pointer':
/home/pgolinski/Dokumenty/Programowanie/spellcheck-pg359186/src/dictionary/error.h:8: multiple definition of `error_validate_pointer'
../dictionary/libdictionary.a(hint.c.o):/home/pgolinski/Dokumenty/Programowanie/spellcheck-pg359186/src/dictionary/error.h:8: first defined here
../dictionary/libdictionary.a(state_set.c.o): In function `error_validate_pointer':
/home/pgolinski/Dokumenty/Programowanie/spellcheck-pg359186/src/dictionary/error.h:8: multiple definition of `error_validate_pointer'
../dictionary/libdictionary.a(hint.c.o):/home/pgolinski/Dokumenty/Programowanie/spellcheck-pg359186/src/dictionary/error.h:8: first defined here

我可能会遇到这些错误的原因是什么?如何避免呢?

2 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为你多次#include一个定义,所以实际上你最终会有多个定义 - 每个定义包含一个定义。

将您的代码更改为

#ifndef __ERROR_H__
#define __ERROR_H__

#include <stdio.h>
#include <stdlib.h>

void error_validate_pointer(void *ptr);

#endif /* __ERROR_H__ */

...用于标题,因此它只包含函数的声明。

然后使用定义

创建一个新文件(例如error.c
#include "error.h"

void error_validate_pointer(void *ptr)
{
    if (ptr == NULL)
    {
        puts("Error with allocating memory");
        exit(1);
    }
}

答案 1 :(得分:0)

或者将函数分离到自己的C文件中,如果将函数声明为static,则可以在头文件中定义它。如果你放置内联也是gcc不会编译未使用的静态函数。通过将其声明为静态函数,它的名称将不会在目标文件外部显示,因此您不会发生冲突。这将导致函数被定义多次,因此它会使您的代码变大,具体取决于您使用它的频率。

您的代码最终将是:

#ifndef __ERROR_H__
#define __ERROR_H__

#include <stdio.h>
#include <stdlib.h>

static inline void error_validate_pointer(void *ptr)
{
    if (ptr == NULL)
    {
        puts("Error with allocating memory");
        exit(1);
    }
}

#endif /* __ERROR_H__ */