#ifndef没有按预期工作

#ifndef not working as expected

本文关键字:工作 #ifndef      更新时间:2023-10-16

获取已在GUI中定义的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

我是否误解了include和#ifndef的性质?

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

 #ifndef PAL_INCLUDED
 #define PAL_INCLUDED
 // definitions
 #endif
参考

包括警卫

我认为你应该在PAL.h上使用include保护。

如果我明白你想做什么,这段代码就更清楚了(而且在那里很常见):

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"
...

希望有帮助。

Main.cpp和GUI.cpp分别编译,然后链接在一起。这意味着在两个编译器之间重置预处理器状态,并且丢失了PAL_INCLUDE
的定义。头文件保护防止一个头文件被同一编译单元中的其他头文件多次包含,而不是为了防止链接器中的冲突。

尝试将static放在方法声明的前面-它将函数限制为当前单元,从而防止此问题。有关更多信息,请参见什么是"静态"函数?

addPal被定义了两次,一次在GUI.cpp中,一次在main.cpp中。您需要的是定义它一次,并在需要使用它的任何地方声明它。我建议把

int (*addPAL)( int, void(*)(), void(*)() );

在一个.cpp文件中(我没有看到足够的代码来确定它属于哪个文件),然后声明:

extern int (*addPAL)( int, void(*)(), void(*)() );
头文件中的

。extern告诉编译器指针addPAL存在,但在其他地方定义