#ifndef没有按预期工作

时间:2011-11-30 23:17:52

标签: c++ include c-preprocessor

获取“已在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的性质?

4 个答案:

答案 0 :(得分:5)

您可能是因为预处理器在GUI.cpp之前处理main.cpp而得到错误。 尝试将PAL.h的内容更改为:

 #ifndef PAL_INCLUDED
 #define PAL_INCLUDED
 // definitions
 #endif

参考

Include guard

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