本文主要是介绍代码疑云(6)-头文件的正确定义,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
头文件print_tools.h
[cpp] view plaincopy
1. #include<stdio.h>
2. void printStr(const char *pStr)
3. {
4. printf("%s\n",pStr);
5. }
6. void printtInt(const int i)
7. {
8. printf("%d\n",i);
9. } 头文件counter.h
[cpp] view plaincopy
1. #include"print_tools.h"
2. static int sg_value;
3. void counter_init()
4. {
5. sg_value=0;
6. }
7. void counter_count()
8. {
9. sg_value++;
10. }
11. void counter_out_result()
12. {
13. printStr("the result is:");
14. printtInt(sg_value);
15. } main.cpp
[cpp] view plaincopy
1. #include "print_tools.h"
2. #include "counter.h"
3. int main()
4. {
5. char ch;
6. counter_init();
7. printStr("please input some charactors:");
8. while((ch=getchar())!='$')
9. {
10. if(ch=='A')
11. <span style="white-space:pre"> </span>counter_count();
12. }
13. counter_out_result();
14. }
疑:以上代码编译时有何问题吗,是什么导致的呢?
解答:void printStr(const char*)和'voidprinttInt(int) 函数redefine了,道理很简单,因为在counter.h中已包含了print_tools.h,在main.cpp中又包含了print_tools.h头文件,也就是两次包含了print_toosl.h,所以也就发生了重定义错误,这是初学者常见问题,要避免这个问题,我们必须采取防范措施,就是使用预编译命令,如下作修改:
头文件print_tools.h
[cpp] view plaincopy
1. #ifndef PRINT_TOOLS_H //如果未定义 PRINT_TOOLS_H
2. #define PRINT_TOOLS_H //则定义 然后编译以下源代码
3. #include<stdio.h>
4. void printStr(const char *pStr)
5. {
6. printf("%s\n",pStr);
7. }
8. void printtInt(const int i)
9. {
10. printf("%d\n",i);
11. }
12. #endif //结束 //如此改头文件就只被编译器编译一次了,起到了防范重定义错误的作用
头文件counter.h
[cpp] view plaincopy
1. #ifndef COUNTER_H //
2. #define COUNTER_H //
3. #include"print_tools.h"
4. static int sg_value;
5. void counter_init()
6. {
7. sg_value=0;
8. }
9. void counter_count()
10. {
11. sg_value++;
12. }
13. void counter_out_result()
14. {
15. printStr("the result is:");
16. printtInt(sg_value);
17. }
18. #endif //
在一个工程项目中头文件众多繁杂,采用这个方法可以很好的避免,所以每当我们定义一个头文件时要养成如此的良好习惯。
这篇关于代码疑云(6)-头文件的正确定义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!