#ifndef没有按预期工作
#ifndef not working as expected
获取已在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存在,但在其他地方定义
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链接错误(#ifndef 无法按预期工作)
- #ifndef没有按预期工作