**代码:**
头文件print_tools.h
****
~~~
#include<stdio.h>
void printStr(const char *pStr)
{
printf("%s\n",pStr);
}
void printtInt(const int i)
{
printf("%d\n",i);
}
~~~
头文件counter.h
****
~~~
#include"print_tools.h"
static int sg_value;
void counter_init()
{
sg_value=0;
}
void counter_count()
{
sg_value++;
}
void counter_out_result()
{
printStr("the result is:");
printtInt(sg_value);
}
~~~
main.cpp
~~~
#include "print_tools.h"
#include "counter.h"
int main()
{
char ch;
counter_init();
printStr("please input some charactors:");
while((ch=getchar())!='$')
{
if(ch=='A')
counter_count();
}
counter_out_result();
}
~~~
**疑:**以上代码编译时有何问题吗,是什么导致的呢?
解答:void printStr(const char*)和'void printtInt(int) 函数redefine了,道理很简单,因为在counter.h中已包含了print_tools.h,在main.cpp中又包含了print_tools.h头文件,也就是两次包含了print_toosl.h,所以也就发生了重定义错误,这是初学者常见问题,要避免这个问题,我们必须采取防范措施,就是使用预编译命令,如下作修改:
****
头文件print_tools.h
****
~~~
#ifndef PRINT_TOOLS_H //如果未定义 PRINT_TOOLS_H
#define PRINT_TOOLS_H //则定义 然后编译以下源代码
#include<stdio.h>
void printStr(const char *pStr)
{
printf("%s\n",pStr);
}
void printtInt(const int i)
{
printf("%d\n",i);
}
#endif //结束 //如此改头文件就只被编译器编译一次了,起到了防范重定义错误的作用
~~~
**头文件counter.h**
****
~~~
#ifndef COUNTER_H //
#define COUNTER_H //
#include"print_tools.h"
static int sg_value;
void counter_init()
{
sg_value=0;
}
void counter_count()
{
sg_value++;
}
void counter_out_result()
{
printStr("the result is:");
printtInt(sg_value);
}
#endif //
~~~
在一个工程项目中头文件众多繁杂,采用这个方法可以很好的避免,所以每当我们定义一个头文件时要养成如此的良好习惯。
======= welcome to my HomePage([*http://blog.csdn.net/zhanxinhang*](http://blog.csdn.net/zhanxinhang)) to have a communication =======