头文件引用多次的有关问题
头文件引用多次的问题C/C++ code//头文件 H1.H#ifndef asdf#define asdfclass a{public:void f(int x,int
头文件引用多次的问题
C/C++ code//头文件 H1.H#ifndef asdf#define asdfclass a{public: void f(int x,int y); void g();private: int x,y;};#include<iostream>void n(){ std::cout<<"进入头文件"<<std::endl;}#endif
C/C++ code//文件gg.cpp 用于类a的实现#include"H1.H"#include<iostream>void a::f(int a,int b){ x=a;y=b;}void a::g(){ std::cout<<x<<' '<<y<<std::endl;}
C/C++ code//主函数 kk.CPP#include"H1.H"int main(){ a k; k.f(1,4); k.g(); n(); return 0;}
编译时可过
连接时 出现错误
说 n()函数被重复定义
为什么 头文件中的
#ifndeif
#define asdf
。。。。。。
#endif
没有在用呢 ??
没有限定头文件的多次引入呢??
还有为什么编译可过 而连接是错呢
为什么呢 说说整个程序编译到连接的过程呀
[解决办法]include就是简单复制
ifndef/define只是防止在同一个文件中多次引用同一个头文件
管不了在不同文件中的引用
[解决办法]宏展开只在当前cpp文件有效,所以gg.cpp和kk.cpp里面都会展开并编译
只有在链接的时候才会发现重复定义了
解决的办法是把定义放到.cpp,.h里面声明一下
[解决办法]gg.cpp和kk.cpp中都包含了该头文件,而你在头文件中定义了一个函数,这样子的话,头文件展开,在两个cpp中都包含了你定义的那个函数void n()。C++是单独编译的,每一个cpp文件会生成一个.obj文件,这两个.obj文件中都包含了void n()的二进制代码。在链接的时候,链接器会发现两个void n()的实现,从而造成链接错误。
结局的方法就如Erorr所说,在.h中声明该函数,将函数的定义放在一个cpp中就可以了。
[解决办法]