我正在尝试构建大型项目,其中包含以下头文件
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
我可能会遇到这些错误的原因是什么?如何避免呢?
答案 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__ */