C++头文件报错,头文件保护符使用

提要

C++头文件是为了声明函数,声明变量。
注意,是声明。 int a=1;是直接定义了。
extern int a; 这是声明,指示编译器这个变量可能在别的文件中被定义,编译器会在符号表中找到定义后填入响应的值。
一个项目中一个变量只会有一次定义,多次定义就叫重定义了。

丢人的错误

[点击并拖拽以移动]在这里插入图片描述
  看这个tou.h,我在a.cpp和b.cpp都include了,然后报错,a重定义了,显然如此,因为这是一个项目,把a.cpp和b.cpp单独链接成a.o和b.o之后不会报错,到最后编译链接成项目名.exe就会出现全局变量重定义,后来仔细想想,我对头文件的理解有失偏驳。

  头文件就是为定义而生的,然后创建同名.cpp文件进行实现,我多次定义当然会报错。编译器看到一个声明,会在符号表中存储下来,遇到定义之后找到对应值然后完成赋值,你每定义一次创建一次变量便会报错。(把.h当成字符串替换便可)

头文件保护符#ifndef不是针对这种情况的,每个头文件加上这个是个好习惯,如果不加可能会出现以下场景:
有A.h,里面定义了一些方法。
有B.h,里面#include了A.h,也定义了一些方法。
现在main.cpp同时#include了A.h和B.h,就要报错了,字符串替换后包含了两次A.h,如果加了上头文件保护符,再导入A.h会不用执行,就避免了这种情况。

长记性,避免再问无脑问题

把头文件保护符这当成个习惯,会减少不必要的麻烦。
头文件尽量不要使用命名空间,减少冲突。
如果想清楚地明白各个文件依赖关系什么,头文件替换是什么样子,建立用gcc/g++ -E预编译测试下,一目了然。

发布了72 篇原创文章 · 获赞 83 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41033366/article/details/105143747