【问题标题】:C - multiple definition of function during building large projectC - 构建大型项目期间的多个功能定义
【发布时间】:2015-06-13 14:36:29
【问题描述】:

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

错误.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

我不断收到这些错误的原因可能是什么?如何避免?

【问题讨论】:

  • 在每个文件中声明函数static。这是一个链接器错误。您试图解决它的预处理器机制不起作用。编译器完全独立于其他所有源文件来处理每个源文件。换句话说,它每次开始处理源文件时都会“忘记”所有先前的定义。 ifndef/define 用于防止在在给定源文件上工作时“重复定义”,但不能超出它。在编译结束时,多个实例(全局函数或变量)被视为链接错误。
  • 通常 .h 文件不包含实际代码。通常它们只包含声明和/或预处理器#defines 和宏。

标签: c


【解决方案1】:

发生这种情况是因为您多次#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);
    }
}

【讨论】:

    【解决方案2】:

    或者将函数分离到它自己的C文件中,如果你将函数声明为静态,你可以在头文件中定义它。如果你放置 inline 也是 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__ */
    

    【讨论】:

      猜你喜欢
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多