我有C++项目,它包含多个(实际上很多).cpp和.h文件.在编写头文件时,我有一个文件如下
例如,MyHeaderFile.h
#ifndef _MYHEARDERFILE_H
#define _MYHEARDERFILE_H
// Here i have function defintion.
void myFunc() {cout << "my function" << endl; }
#endif
Run Code Online (Sandbox Code Playgroud)
上面的文件包含在多个文件中.在编译时我得到了"myfunc"的多重定义"错误.我希望标题只包含一次,因为我有#ifndef检查所以我期待错误不应该被抛出.
例如,在模板的情况下,我们必须在头文件中定义,在这种情况下我们如何避免我现在面临的问题?
任何人都可以帮助我,为什么我看到错误?我的理解对吗?
谢谢!
通常,将函数声明放在头文件中,并在源文件中放置函数定义(即实际的函数体/实现).否则,您将得到您正在看到的问题:头文件被#included(即替换)为多个源文件,因此该函数最终被定义多次.这会混淆链接器,所以它会抱怨.
标头保护#ifndef ...内容仅防止标头多次被替换到同一源文件中.请记住,每个源文件都是完全独立于其他源文件编译的; 所有#defines和其他定义都为每个定义"重置".
一种可能的替代解决方案是将函数定义保留在头文件中,而只是将其标记inline(这具有消除链接器错误的副作用).但是,就个人而言,我不会这样做.