2011-09-27 145 views
2

我有一个文件命名为functions.h ....现在我知道在头文件中定义函数是不明智的,但这与我所关心的问题相比,并没有出现问题。 ..包含头文件

我在一个名为

void sayhi() 
{ 
    cout<<"hi"; 
} 

现在functions.h我做了,其功能在lines.cpp文件中定义一个lines.h文件中定义的函数...在lines.cpp文件包括我functions.h ...和used sayhi();在线类的构造函数...然后在mymain.cpp(包含int main)我再次包含functions.h和主要我叫sayhi();

但是当我编译程序时,它显示mymain.cpp中的一个错误,告诉sayhi()已经在lines.obj中定义了...你能指出我做错了什么吗?

+0

关于标头实现的智慧,看到这个问题http://stackoverflow.com/questions/1001639/coding-c-without-headers-best-practices和特别是我的答案http://stackoverflow.com/问题/ 1001639 /编码-C-没有报头条最佳实践/ 1001749#1001749。 –

+0

该问题正是为什么你不应该_define_(又名。实现)一个头文件中的函数... –

回答

7

好了,解决的办法是声明的功能functions.h然后定义它functions.cpp,自然的方式意图。

+1

+1为自然。 –

+0

@david ...没关系,但我还有一个问题....如果我们在头文件中声明一个模板类并在.cpp文件中定义它,然后如果我们在main(包含int main)中包含头文件,文件,那么为什么连接错误会突然出现......并且如果我们在主文件中包含.cpp文件(包含头文件),错误不会出现...... – avinash

+0

@avinash将此作为一个新问题提出。评论不适合提出全新的问题。 –

3

使你的功能inline避免了这个多重定义问题。

尝试,

inline void sayhi() 
{ 
    cout<<"hi"; 
} 

This链接可能对您有所帮助。

特别地,它引用的ISO C++标准的部分7.1.2:

内联函数应每翻译单元,其中 它被使用,而且必须具有完全相同在每个相同的定义来定义案例 (3.2)。

这就是为什么one-definition-rule规避。