面试题答案
一键面试考量因素
- 预处理器宏的唯一性:不同平台可能有不同的命名习惯或已定义的宏。为确保宏在所有平台上都唯一,避免冲突,应采用项目相关的独特命名,例如使用项目名、模块名作为前缀。
- 平台差异:不同系统对头文件路径、搜索顺序等处理不同。需确保头文件重复包含防护机制在各平台都能正常工作,不依赖特定平台的头文件搜索特性。
- 兼容性:要与不同的C语言编译器兼容,包括Windows下的MSVC、Linux下的GCC以及MacOS下的Clang等,保证防护机制在各种编译器环境中都能正确生效。
代码示例
- 传统的 #ifndef 方式
// example.h
#ifndef _EXAMPLE_H_
#define _EXAMPLE_H_
// 这里定义函数、结构体、全局变量声明等
void exampleFunction();
#endif // _EXAMPLE_H_
- _Pragma 方式
// example.h
#pragma once
// 这里定义函数、结构体、全局变量声明等
void exampleFunction();
#pragma once
方式更为简洁,大多数现代编译器都支持,但某些较老的编译器可能不支持。#ifndef
方式兼容性更好,可在所有平台和编译器上使用。在实际项目中,若要最大程度保证兼容性,可优先选择 #ifndef
方式。若项目主要面向较新的编译器环境,#pragma once
也是不错的选择。