C++头文件中#pragma once和#ifndef之类的...
目前我所接触的所有C/C++代码,没有哪一个的头文件里面没写#pragmaonce或者#ifndefXXX_H之类的东东,或许是我接触东西太少。我就是想问:1.会存在一种...
目前我所接触的所有C/C++代码,没有哪一个的头文件里面没写#pragma once或者#ifndef XXX_H之类的东东,或许是我接触东西太少。
我就是想问:
1.会存在一种使用情况,将某一个头文件include多次吗?,至少我目前没有见到过,是否可以说明基本很少会使用这功能?
2.相对第一条,如果说这个功能没有任何意义,那么为什么编译器不自己限制对一个文件只包含一次,而不必让程序员自己在头文件上加一个#ifndef XXX_H之类的废代码来浪费时间!,如果说有意义,那么#ifndef XXX_H的存在意义是什么?
谢谢。 展开
我就是想问:
1.会存在一种使用情况,将某一个头文件include多次吗?,至少我目前没有见到过,是否可以说明基本很少会使用这功能?
2.相对第一条,如果说这个功能没有任何意义,那么为什么编译器不自己限制对一个文件只包含一次,而不必让程序员自己在头文件上加一个#ifndef XXX_H之类的废代码来浪费时间!,如果说有意义,那么#ifndef XXX_H的存在意义是什么?
谢谢。 展开
2个回答
展开全部
好吧,我写所有的h文件时都会加#pragma once的,因为我一开始学编程老师就告诉说这是个好习惯。
将某一个头文件include多次是可能的。比如A.h包含了B.h,然后C.cpp里包含了A.h与B.h。这样B.h就被包含了两次。尤其当工程很大的时候更容易出现这种情况。
至于为什么编译器不”自动“限制重复包含,我想是因为这种分析过于复杂了,尤其是在大工程的情况下,所以当初的设计者经过权衡就没有加。而是让程序员用#pragma once或#ifndef XXX_H的方法来避免。
将某一个头文件include多次是可能的。比如A.h包含了B.h,然后C.cpp里包含了A.h与B.h。这样B.h就被包含了两次。尤其当工程很大的时候更容易出现这种情况。
至于为什么编译器不”自动“限制重复包含,我想是因为这种分析过于复杂了,尤其是在大工程的情况下,所以当初的设计者经过权衡就没有加。而是让程序员用#pragma once或#ifndef XXX_H的方法来避免。
更多追问追答
追问
过于复杂?
复杂的编译器都搞出来了,这么个玩意还搞不上去吗?
最简单的实现莫过于编译器在识别头文件的时候完全可以默认文件头部都有#pragma once的存在不就好了么。
对于你所谓的include多次,由于你的头文件上面有#pragma once限制了,所以还是只包含了一次,我所谓的多次是没有加上#pragma once和#ifndef XXX_H之类的东东而包含的。
追答
你知道编译器对include是怎么处理的吧?要是按你说的“真”包含多次,早就报错了好不好。
展开全部
“为什么编译器不自己限制对一个文件只包含一次”:
因为对同一个文件包含两次可能是部分代码需要,我就在一个比较成熟的项目里面看到过 对一个头文件包含两次的,大致原理如下:
头文件f.h里面 有两部分,分别被 MACRO_A 和MACRO_B包括着,
在g.c里面某个地方,先定义了MACRO_A,然后include f.h,接着undef MACRO_B
在后面某个地方 又定义了MACRO_B,然后include f.h,再接着undef MACRO_B
因为对同一个文件包含两次可能是部分代码需要,我就在一个比较成熟的项目里面看到过 对一个头文件包含两次的,大致原理如下:
头文件f.h里面 有两部分,分别被 MACRO_A 和MACRO_B包括着,
在g.c里面某个地方,先定义了MACRO_A,然后include f.h,接着undef MACRO_B
在后面某个地方 又定义了MACRO_B,然后include f.h,再接着undef MACRO_B
追问
其实纠结来纠结去,就是说这个功能不常用嘛。谢谢。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询