c++中的重定义,重包含。

重定义

1.重定义的概念
一个变量被直接或者间接多次定义导致的错误

  1. 导致重定义的三种情况
    第一种:就是同一个变量多次在一个文件中定义,例如:int a=1;int a=2;(a就是 重定义)
    第二种:由于重复包含头文件导致的变量的重定义,例如在a.h中定义了一个变量 int a=3;后来b.h包含了a.h,并且又在b.h中定义了int a=7;(这种情况不好解决,所以我们不建议在头文件里面定义全局变量)
    第三种: 就是因为在一个项目里面多次定义一个相同的变量;例如,在a.cpp中定义了int a=1;又在b.cpp中再次定义了int a=9;
    第四种:就是由于嵌套包含导致的头文件的重复包含而导致的重定义,比如:b.h包含了a.h,c.h包含了b.h,在c.h中写#include

#pragma once和#ifndef XXXX_H的区别

相同点:作用都是解决重复包含的问题,保证同一个头文件不会重复包函多次
#
ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。

 缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况  。编译器每次打开头文件都会有检查是否有重定义。编译的时间较长

  #pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。
相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正**
   *方式一由语言支持所以移植性好,方式二 可以避免名字冲突*

重定义的解决
重复包含引起的重定义

猜你喜欢

转载自blog.csdn.net/yychentracy/article/details/81410610