首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#ifndef未按预期工作

#ifndef未按预期工作
EN

Stack Overflow用户
提问于 2011-12-01 07:17:52
回答 4查看 8.7K关注 0票数 2

为PAL.h中的函数指针获取“已在GUI.obj中定义”的LNK2005

代码语言:javascript
复制
//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

我是否误解了includes和#ifndef的本质

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-01 07:22:36

出现这个错误可能是因为预处理器在处理GUI.cpp之前正在处理main.cpp。尝试将PAL.h的内容更改为以下内容:

代码语言:javascript
复制
 #ifndef PAL_INCLUDED
 #define PAL_INCLUDED
 // definitions
 #endif

参考

Include guard

票数 5
EN

Stack Overflow用户

发布于 2011-12-01 07:21:33

我认为你应该使用include guard而不是PAL.h

如果我理解你想做什么的话,这段代码要清晰得多(也很常见):

GUI.h

代码语言:javascript
复制
#ifndef _GUI_H_
#define _GUI_H_
...
#endif

GUI.cpp

代码语言:javascript
复制
#include "PAL.h"
...

PAL.h

代码语言:javascript
复制
#ifndef _PAL_H_
#define _PAL_H_

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

#endif

main.cpp

代码语言:javascript
复制
#include "GUI.h"
#include "PAL.h"
...

希望能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2011-12-01 07:29:37

Main.cpp和GUI.cpp是分开编译的,然后链接在一起。这意味着在两次编译之间预处理器状态被重置,并且丢失了PAL_INCLUDE的定义

标头保护阻止同一编译单元中的其他标头多次包含一个标头,而不是为了防止链接器中的冲突。

尝试将static放在方法声明的前面-它将函数限制为当前单元,从而防止了此问题。有关更多信息,请参阅What is a “static” function?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8334416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档