看到一段代码使用了 #pragma once
:
#if !defined(STRING_MANIPULATOR_H_INCLUDED)
#define STRING_MANIPULATOR_H_INCLUDED
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#endif // !defined(AFX_STRINGTOKENIZER_H__03F4D15A_A411_42B6_9F90_485B62939428__INCLUDED_)
#pragma once
目的和#ifndef
,#define
,#endif
目的相同,防止头文件被重复包含。
#pragma once
是编译器选项, GCC3.4之前的版本不支持,而#ifndef
受语言自身支持。
#pragma once
的缺点是,如果相同的文件分散在不同位置,编译器会以为它们是不同的文件。
使用#pragma once
的好处是,如果文件名改变,不需要作任何修改,但是如果使用#ifndef
,#define
,#endif
就要修改,造成维护的困难。绝大多数情况下, 使用#pragma once
都能实现预期目的。
#ifndef MY_HEADER_HPP // 如果文件名改变,也要修改MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif
[1] https://stackoverflow.com/questions/787533/is-pragma-once-a-safe-include-guard