0

我有一个以开头的头文件

#if !defined(__GLOBAL_H)
#define  __GLOBAL_H

然后是一些代码

#endif

该代码仅包含函数声明,一些包含其他头文件和一些模板函数。但是,当我添加一行代码时,就会出现问题。我收到链接器错误,我添加的函数已在目标文件中定义。我使用 Visual Studio 2012 Premium 作为编译器。我试图从头文件中删除任何现有函数,这也通过编译器。另一方面,如果我向编译器添加任何可能是新的新行,它会拒绝编译,说它已经被定义。有没有人知道可能出了什么问题,或者我是否偶然发现了编译器本身的错误?(我非常怀疑) 编辑:解决方案是将函数声明为头文件,但在 CPP 文件中定义它。但真正的问题是,当我包含一个用于返回头文件中声明的类型的对象的头文件时,它不会编译。它的许多错误“Missing ; in front of *”是在其他头文件中声明的类型。

4

2 回答 2

2

尽管您没有显示使用任何代码或错误消息,但我猜测标题中存在函数定义(包括函数体的代码),而不仅仅是声明。

这些必须要么声明inline,这允许它们在多个翻译单元中定义;移动到单个源文件中,只在标题中留下声明,因此它们仅在一个翻译单元上定义。

“一个定义规则”说(除非它们是内联的)函数在程序中可能只有一个定义。

此外,您的包含保护不应以下划线开头,也不应包含双下划线;像这样的名字是保留的。

于 2013-04-20T23:30:10.180 回答
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()
{
}
于 2013-04-20T23:28:42.637 回答