在包含定义的.hpp头文件中是否应使用#pragma once指令?
关于.hpp头文件是否应使用
#pragma once的问题 结论:依然应该使用#pragma once
不管是传统的.h声明头文件,还是包含大量定义的.hpp头文件,#pragma once的核心作用都是避免同一个头文件被编译器重复读取、预处理和编译,这个需求是通用的,具体原因如下:
首先,.hpp里的定义并非都能安全重复包含:
比如你可能在.hpp里写了inline函数、模板实现、constexpr变量,虽然这些语法允许在多个编译单元存在定义,但重复包含会让编译器多次处理相同代码,白白增加编译时间。如果不小心在.hpp里放了非inline的普通函数/全局变量定义,没加防护的话,同一个编译单元里多次包含就会直接触发「重复定义」的编译错误。其次,
#pragma once和头文件内容类型无关:
它只关心「这个文件有没有被当前编译单元包含过」,不管文件里是声明还是定义。哪怕你的.hpp全是模板实现(必须放在头文件里的内容),只要有可能被多个其他头文件或.cpp包含,就需要用它来避免重复处理。额外提醒:
如果你的.hpp里有非inline的全局定义(比如普通函数、非const全局变量),就算加了#pragma once,在多个.cpp里包含它还是会报重复定义——这不是#pragma once的问题,而是你违反了「头文件不应放非inline全局定义」的规则,这类代码应该移到.cpp源文件里。
内容的提问来源于stack exchange,提问作者LRetro
相关产品推荐
相关产品推荐

