获取“已在GUI.obj中定义的LNK2005”以获取PAL.h中的函数指针
//GUI.cpp
#include "PAL.h"
//PAL.h
#define PAL_INCLUDE
int (*addPAL)( int, void(*)(), void(*)() );
//main.cpp
#include "GUI.h"
#ifndef PAL_INCLUDE
#include "PAL.h"
#endif
我是否误解了包含和#ifndef
的性质?
答案 0 :(得分:5)
您可能是因为预处理器在GUI.cpp之前处理main.cpp而得到错误。
尝试将PAL.h
的内容更改为:
#ifndef PAL_INCLUDED
#define PAL_INCLUDED
// definitions
#endif
参考
答案 1 :(得分:3)
我认为您应该使用include guard而不是PAL.h
。
如果我理解您正在尝试做的事情,那么这段代码就更清晰了(并且非常常见):
GUI.h
#ifndef _GUI_H_
#define _GUI_H_
...
#endif
GUI.cpp
#include "PAL.h"
...
PAL.h
#ifndef _PAL_H_
#define _PAL_H_
int (*addPAL)( int, void(*)(), void(*)() );
#endif
的main.cpp
#include "GUI.h"
#include "PAL.h"
...
希望它有所帮助。
答案 2 :(得分:2)
addPal定义两次,一次在GUI.cpp中,一次在main.cpp中。你想要的是定义它一次并在任何你需要使用它的地方声明它。我建议把
int (*addPAL)( int, void(*)(), void(*)() );
在其中一个.cpp文件中(我没有看到足够的代码来决定它属于哪一个),然后是声明:
extern int (*addPAL)( int, void(*)(), void(*)() );
头文件中的。 extern告诉编译器指针addPAL存在,但在别处定义
答案 3 :(得分:1)
Main.cpp和GUI.cpp彼此分开编译,然后链接在一起。这意味着预处理器状态在两个编译之间重置,您将失去PAL_INCLUDE的定义 标题保护会阻止标题被同一个编译单元中的其他标题包含多次,而不是为了防止链接器中的冲突。
尝试将static
放在方法声明之前 - 它将函数限制为当前单位,从而防止出现此问题。
有关详细信息,请参阅What is a “static” function?