面试题答案
一键面试#ifndef
、#define
、#endif
组合
- 原理:
#ifndef
用于检测某个宏是否未定义。若该宏未定义,则后续的代码(直到#endif
)会被处理。当第一次包含头文件时,宏尚未定义,于是头文件内容被处理,并定义该宏。再次包含时,由于宏已定义,#ifndef
条件不成立,头文件内容不再被处理,从而避免重复包含。例如:
#ifndef _HEADER_FILE_NAME_
#define _HEADER_FILE_NAME_
// 头文件内容
#endif
- 适用场景:几乎适用于所有的C语言编译器,具有广泛的兼容性,在跨平台项目中是首选方法,因为不同平台和编译器都能很好地支持。
#pragma once
- 原理:这是编译器相关的指令,它告诉编译器,该头文件在每个编译单元中只被包含一次。编译器通过内部机制来确保这种唯一性,比如基于文件系统路径等方式识别,当编译器遇到
#pragma once
时,它会记录该头文件,后续再次遇到包含该头文件的指令时,就不再重复处理。 - 适用场景:现代编译器基本都支持,但在一些非常古老的编译器上可能不支持。在只针对特定现代编译器的项目中使用,可以简化代码结构,因为无需额外定义宏。同时在不涉及复杂跨平台场景时,使用起来更为简洁。