用于C/C++代码的预处理程序指令#ifndef

Lei*_*sen 16 c c++ eclipse c-preprocessor

在eclipse中,每当我创建一个新的C++类或C头文件时,我都会得到以下类型的结构.假设我创建头文件example.h,我得到这个:

/*Comments*/
#ifndef EXAMPLE_H_
#define EXAMPLE_H_
/* Place to put all of my definitions etc. */
#endif
Run Code Online (Sandbox Code Playgroud)

我认为ifndef说如果没有定义EXAMPLE_H_,请定义它,这可能是有用的,这取决于您用来编译和链接项目的工具.但是,我有两个问题:

  1. 这是相当常见的吗?我不经常看到它.使用该量规是一个好主意,还是应该直接定义代码.

  2. 什么是EXAMPLE_H_究竟是什么?为什么不是example.h,还是只是示例?有没有什么特别的,或者可能只是eclipse如何更喜欢自动构建项目?

use*_*405 15

这是一种常见的结构.目的是仅在翻译单元中包含头文件的内容一次,即使物理头文件被包含多次也是如此.例如,如果您直接在源文件中包含标头,并且它也通过另一个标头间接包含,则会发生这种情况.

将#ifndef包装器放在内容周围意味着编译器只解析标头的内容一次,并避免重新定义错误.

有些编译器允许"#pragma once"做同样的事情,但#ifndef构造在任何地方都可以工作.