面试题答案
一键面试方法一:宏定义(#ifndef
、#define
、#endif
)
- 原理:
#ifndef
是 “if not defined” 的缩写,用于判断某个宏是否未定义。如果该宏未定义,则执行后续代码块。#define
用于定义一个宏。在头文件中,当#ifndef
判断宏未定义时,会执行#define
语句定义该宏。#endif
用于结束#ifndef
开始的条件编译块。这样,当同一个头文件再次被包含时,由于宏已经被定义,#ifndef
条件不成立,后续头文件内容不会被再次编译,从而避免重复包含。
- 示例:
假设我们有一个头文件
example.h
,内容如下:
#ifndef EXAMPLE_H
#define EXAMPLE_H
// 这里写头文件的内容,比如函数声明、结构体定义等
void exampleFunction();
#endif
方法二:#pragma once
- 原理:
#pragma once
是一种编译器指令,它告诉编译器,这个文件只被编译一次。不同的编译器对#pragma once
的支持程度略有不同,但在现代编译器中,基本都支持这一指令。它的实现依赖于编译器内部的机制,编译器会记录已经处理过的文件,当再次遇到#pragma once
的文件时,不再进行重复编译。
- 示例:
对于
example.h
,使用#pragma once
可写成:
#pragma once
// 这里写头文件的内容,比如函数声明、结构体定义等
void exampleFunction();
两种方法都能有效防止头文件被重复包含,#ifndef
、#define
、#endif
兼容性更好,适用于各种编译器;#pragma once
更简洁,在现代编译器中使用广泛。