【问题标题】:Best way to check multiple inclusions检查多个夹杂物的最佳方法
【发布时间】:2020-01-07 12:22:32
【问题描述】:
#ifndef api_H_
#define api_H_
...
#endif

在上面的代码中,它会检查文件是否已经包含在内,以避免多次包含。

问题:

我想知道是否有更好的方法可以这样做,有哪些替代方法,如果这是更好的方法,那么为什么会这样?

【问题讨论】:

标签: c header-files multiple-inclusions


【解决方案1】:

对于大多数(如果不是全部)现代编译器,您可以使用 #pragma once,它可以完成相同的工作,但可能更快。

您还可以消除名称冲突的风险,如果两个不同的头文件包含相同的预处理器符号 (api_H_),就会发生这种情况。

基本上代替:

#ifndef api_H_
#define api_H_

... header content

#endif

你写:

#pragma once

... header content

另请阅读#pragma once vs include guards?Is #pragma once a safe include guard?

【讨论】:

  • 我仍然看不出#pragma once 会更快的原因。
  • @melpomene 我写了“可能”
  • @melpomene 刚刚找到this interesting answer
  • #pragma once 可能更快的原因是遇到第二个#include "header.h"(包含#pragma once),预处理器不必重新打开文件并读取@987654334 @ 行,然后跳到匹配的#endif 并检查文件中是否还有其他内容等。但是,GCC 实际上优化了经典的包含守卫,因此#pragma once 之间的成本差异很小。
  • 任何命名包含守卫高度冲突的名称(如 api_H)都应该在代码审查中被咀嚼,尤其是完全误解了包含守卫的目的。跨度>
猜你喜欢
  • 1970-01-01
  • 2020-04-13
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 2015-10-27
  • 2010-10-12
相关资源
最近更新 更多