首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

头文件引用多次的有关问题

2012-03-05 
头文件引用多次的问题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中就可以了。
[解决办法]
探讨

gg.cpp和kk.cpp中都包含了该头文件,而你在头文件中定义了一个函数,这样子的话,头文件展开,在两个cpp中都包含了你定义的那个函数void n()。C++是单独编译的,每一个cpp文件会生成一个.obj文件,这两个.obj文件中都包含了void n()的二进制代码。在链接的时候,链接器会发现两个void n()的实现,从而造成链接错误。
结局的方法就如Erorr所说,在.h中声明该函数……

热点排行