防止头文件屡次引入

1.头文件被屡次重复引用会形成的后果:ide

        头文件屡次重复引用:一个头文件被屡次在源文件中屡次引用。spa

先来看一段代码:
code

/*Test.h*/

#include <stdio.h>
int a = 10;
/*Test.c*/

#include "Test.h"
#include "Test.h"

int main()
{
    printf("d o o\n");
    return 0;
}

显示结果:
orm

wKioL1czIknhwaV4AAAL7lxrTAE001.png

出现了错误,因为屡次引入同一头文件,致使变量重定义,这时,有些人就会说,谁会**到引入两次头文件,对哦,那么看下面这个例子:blog

/*Test.h*/

#include <stdio.h>

int a = 10;
/*Test.c*/

#include "Test.h"

int a = 20;

int main()
{
    printf("a = %d\n", a);
    return 0;
}

这个就颇有可能写出来了,固然仍是先看一下结果:get

wKioL1czIknhwaV4AAAL7lxrTAE001.png

和上面那种状况如出一辙..编译器


总结:it

    当屡次引用同一头文件时,会有可能出现变量重定义,致使代码在编译时出错。因此规范的代码应该避免这种状况的发生。io

这是在知乎关于这个问题的讨论和大牛的一些观点-------知乎大牛编译


2.怎样避免发生这种错误

第一种方式:

#ifndef __TEST_H__
#define __TEST_H__

//your code

#endif

采用条件编译的方式,当第一次引入TEST_H时,编译器会检测到TEST_H尚未被定义,那么就会执行下面的内容;当再次引入,就会检测到已经定义了TEST_H,那么此时就不会执行下面的内容,这种采用宏定义的处理,能够颇有效的避免发生这种错误。

第二种方式:

#pragma once

//your code

这是一种由编译器提供支持的方式,防止同一文件的二次编译,这里的同一文件指的是物理文件(实实在在存在的文件)。

两种方式的对比:

#ifndef的方式依赖于宏名字不能冲突,这不光能够保证同一个文件不会被包含屡次,也能保证内容彻底相同的两个文件不会被不当心同时包含。固然,缺点就是若是不一样头文件的宏名不当心相同时,可能就会致使头文件明明存在,编译器却硬说找不到声明的情况。


#pragma once则由编译器提供保证:同一个文件不会被包含屡次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你没必要再费劲想个宏名了,固然也就不会出现宏名相同引起的奇怪问题。对应的缺点就是若是某个头文件有多份拷贝,此时就不能保证他们不被重复包含。固然,相比宏名相同引起的“找不到声明”的问题,重复包含更容易被发现并正。


方式一由语言支持因此移植性好,方式二 能够避免名字冲突。

相关文章
相关标签/搜索