C/C++ 头文件防止被重复包含有2种常用的做法,一种是传统的ifndef
:
#ifndef HEADER_H#define HEADER_H...#endif // HEADER_H
另一种是稍微新一些的pragma once
:
#pragma once...
远古gcc版本不支持pragma once
–gcc 3.4之前的版本不支持pragma once
,也就是前的gcc,现在应该没人用这么古老的编译器吧。
我找到2个问答:
c++ - #pragma once vs include guards? - Stack Overflow
c++ - Is #pragma once a safe include guard? - Stack Overflow
里面的大部分回答都是支持使用pragma once
,因为更方便,更不容易出错,也更快。
不容易出错的意思是,比如有2个头文件foo/string.h
和bar/string.h
,如果使用#ifndef
,并且都定义为
#ifndef STRING_H
,那么这2个头文件会冲突,而且出错后会很难找到问题存在的原因,但是使用pragma once
,
编译器会自动帮你做这些工作,让你不用担心头文件命名的问题。
但是pragma once
也是可能会出错的,根据一个回答的推测,比如说foo.h
跟../a/foo.h
对于gcc编译器来说是不一样的??
这条内容有待验证。
如果你写的工程项目不大,那么推荐使用pragma once
,如果你写的工程项目非常大,推荐做法如下:
#ifndef HEADER_H#define HEADER_H#pragma once...#endif // HEADER_H
这样的话双重保险。
反正我用pragma once
,非常方便,没遇到过问题。