添加更多的代码,使代码uncompileable
#if !defined(__GLOBAL_H)
#define __GLOBAL_H
再接着
#endif
的代码只包含函数声明一些代码开头的头文件,一些包括其他头文件和几个模板函数。但是,当我添加一行代码时会发生此问题。我收到链接器错误,我添加的函数已经在一个对象文件中定义。我使用Visual Studio 2012 Premium作为编译器。我试图从头文件中删除任何现有的函数,这也通过编译器。另一方面,如果我添加了可能对编译器来说是新的新行,它会拒绝编译,说它已经被定义。有没有人有任何线索可能是错误的,或者我可以偶然发现编译器本身的错误? (我非常怀疑) 编辑: 解决的办法是声明函数的头文件,但要在CPP文件中定义它。但真正的问题是,当我包含用于返回头文件中声明的类型的对象的头文件时,它不会编译。它的许多错误“缺少;在*之前”是在其他头文件中声明的类型。
将非内联函数定义添加到头文件通常是不好的。编译器将生成函数的代码,其中包含文件,导致您遇到的重新定义错误。相反,您应该在头文件中声明函数,并将定义放置在源文件(.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()
{
}
将代码添加到.cpp文件,而不是工作。但是,当我在头文件中包含另一个头文件时,它会抗议说“丢失;之前*”,这是每次我返回后 – Martin 2013-04-20 23:30:28
您可能会错误地声明该函数,请确保末尾有分号。 – 2013-04-20 23:31:47
@Martin:听起来好像它正在返回一个尚未声明的类型,通常需要声明的东西在使用之前,确保你包含了所有你需要的头文件 – 2013-04-20 23:31:51
虽然你还没有表现出使用任何代码或错误消息,我猜,有函数定义(包括函数体的代码),而不仅仅是头文件中的声明。
这些必须要么被宣布为inline
,这允许它们在多个翻译单元中定义; 或移到单个源文件中,只在头中留下声明,所以它们只在一个翻译单元上定义。
“一个定义规则”表示(除非它们是内联)函数只能在程序中有一个定义。
另外,您的包含警卫不应该以下划线开头,也不应包含双下划线;像这样的名字是保留的。
然后不要在函数中定义函数定义。 – 2013-04-20 23:26:15
谢谢,它工作:)但是,我也遇到了另一个问题。当我包含一个特定的头文件时,当我返回函数中的指针时,我会遇到很多“缺少; *之前”的信息。 – Martin 2013-04-20 23:28:39
你的代码有未定义的行为,因为__GLOBAL_H是非法的(http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-标识符)。 – JBentley 2013-04-20 23:53:47