读书人

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

发布时间: 2012-02-19 19:43:39 作者: rapoo

头文件包含的疑问? 请高手帮忙!
最近看书,发现了一个问题。就是#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,编译就会报变量重复定义了。

读书人网 >C语言

热点推荐