我有一个以
开头的头文件#if !defined(__GLOBAL_H)
#define __GLOBAL_H
然后是一些代码
#endif
代码仅包含函数声明,其中一些包含其他头文件和一些模板函数。但是,当我添加一行代码时会出现问题。我得到链接器错误,我添加的函数已经在目标文件中定义。我正在使用Visual Studio 2012 Premium作为编译器。我试图从头文件中删除任何现有的函数,这也通过编译器。另一方面,如果我添加任何可能是编译器新内容的新行,它拒绝编译说它已经被定义。有没有人知道可能有什么问题或者我是否偶然发现了编译器本身的错误? (我非常怀疑) 编辑: 解决方案是将函数声明为头文件,但要在CPP文件中定义它。但真正的问题是,当我包含一个头文件来返回头文件中声明的类型的对象时,它不会编译。许多错误“缺失;在*前面”是在其他头文件中声明的类型。
答案 0 :(得分:2)
虽然您没有显示使用任何代码或错误消息,但我猜测标题中有函数定义(包括函数体的代码),而不仅仅是声明。
必须 声明inline
,这允许它们在多个翻译单元中定义; 或移动到单个源文件中,只在标题中留下声明,因此它们仅在一个翻译单元上定义。
“一个定义规则”表示(除非它们是内联的)函数在程序中可能只有一个定义。
此外,你的包含守卫不应该以下划线开头,也不能包含双下划线;这样的名字是保留的。
答案 1 :(得分:1)
向头文件添加非内联函数定义通常很糟糕。编译器将为其中包含的每个文件中的函数生成代码,从而导致您遇到的重新确认错误。相反,您应该声明标题中的函数,并将定义放在源文件(.cpp)中。
Global.h
#if !defined(__GLOBAL_H)
#define __GLOBAL_H
void somefunction(); // <-- declaring the function.
#endif
SomeSource.cpp
#include "Global.h"
// Here is where define the function
void somefunction()
{
}