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

头文件包含的疑问? 请高手帮忙!该怎么解决

2012-02-19 
头文件包含的疑问? 请高手帮忙!最近看书,发现了一个问题。就是#include“。。.h 是不是把头文件里的内容完全

头文件包含的疑问? 请高手帮忙!
最近看书,发现了一个问题。就是#include“。。.h "   是不是把头文件里的内容完全照搬的写在引用的文件里?另外当头文件里有一行代码”int   a; "   这是对a的定义还是对a   的声明?我可能写的不太清楚,大家看下面的几个例子便知:
例1:
**********************************************
//     "add.h "   的代码
#ifndef   C_EXAMPLE_H
#define   C_EXAMPLE_H
  int   df;
  extern   int   add(int   x,int   y);
#endif

*************************************************
//   "add.c "   的代码
#include   "add.h "

add(int   a,   int   b)
{

return   (a+b);
}
*****************************************************
//   "main.c "   的代码
#   include   <stdio.h>
#   include   "add.h "
int   main(int   argc,   char*   argv[])
{
int   sum;
df=12;
sum=add(2,3);  
printf( "%d,%d ",sum,df);
return   0;
}
**********************************************************

将上面三个文件在VC下编译没有出现错误;

当把“add.h "   内容改为下面时:
*****************************************************
#ifndef   C_EXAMPLE_H
#define   C_EXAMPLE_H
  int   df=9;
  extern   int   add(int   x,int   y);
#endif
********************************************************
出现错误,说是df   重复定义。

然而我的理解是对于第一种情况,它也算是对df进行了重复定义(很多书上说   "int   a "即是定义了一个整型变量a,即分配了一个内存空间)为什么它不出现错误呢?

于是我自作聪明的把 "add.c "   的内容改为:
*****************************************************
#ifndef   C_EXAMPLE_H
#define   C_EXAMPLE_H
  extern   df;
  extern   int   add(int   x,int   y);
#endif
********************************************************

结果又出错了:爆出没有找到外部变量df.
我狂晕!     大家帮我分析分析这是怎么回事呀?  


[解决办法]
在头文件中 df声明的时候改为
static int df;
[解决办法]
不要在头文件里定义变量,只声明它。
如果在头文件里定义了变量,而有多个源文件包含了它,则会引起重复定义错误。
在头文件里:extern int a;
在源文件里:int a;
[解决办法]
因为C是一个很不安全的语言,它认为2个.c里的同名(非static)全局变量就是一个变量。
如果你把文件后缀改.cpp,编译就会报变量重复定义了。

热点排行