代码之家  ›  专栏  ›  技术社区  ›  bdhar

#pragma once与if!定义的myheader_included_uu[duplicate]

  •  11
  • bdhar  · 技术社区  · 16 年前

    可能重复:
    #pragma once vs include guards?

    在使用方面(性能、可用性和功能)有什么区别 #pragma once 和 #if !defined MYHEADER_INCLUDED_ 构造?或者两者有什么区别?

    7 回复  |  直到 10 年前
        1
  •  13
  •   Dan McGrath    16 年前

    维基百科有你所有的答案,很容易找到

    From the article

    在C语言和C++编程语言中, #pragma once 是非标准的 但被广泛支持的预处理器指令设计用于 当前源文件在单个编译中只包含一次。

    因此, 一次语用 与 #include 卫兵,但有 几个优点,包括:减少代码,避免名称冲突,以及 提高编译速度。

    它更深入地研究了 article . 如果你真的很感兴趣,我建议你把它读完,而不仅仅是上面的宣传语。

        2
  •  7
  •   Kornel Kisielewicz    16 年前
    1. 性能 --通常 #pragma once 实现编译速度更快,因为它的意图是明确的
    2. 功能 --这两种方法都有相同的用途——避免包含多个头文件。这个 defined 当然,版本也有更广泛的用途,如果仔细使用,将允许在包含前者的情况下签入另一个文件(例如,对于条件编译)
    3. 可用性 --如果可移植性不是问题,请使用 一次语用 --然而,这是一个 非标准 延伸
        3
  •  5
  •   Ondergetekende    16 年前

    虽然pragma-once在许多方面优于ifdef-guards,但它有一个主要缺陷:它基于文件系统路径:它使用两个不同(绝对)路径也是两个不同文件的基本假设。不幸的是,这并不总是正确的。

    虽然你不太可能遇到这个问题,但这是值得注意的。

        4
  •  3
  •   Joris Timmermans    16 年前

    关于这方面的更多背景:

        5
  •  2
  •   Michael Burr    16 年前

    就性能而言,我没有对其进行测量,但据广泛报道,编译器识别出包含保护习语的代码,并且不重新打开/重新处理使用它的文件(因此将它们视为使用过的代码)。 #pragma once )

    除了潜在的性能优势(可能不存在),我很少看到 一次语用 提供-当你创建一个新的头球时会更方便一点-但是守卫并不是很麻烦。自从 一次语用 不是特别引人注目,因为我偶尔会遇到不支持它的编译器,所以我使用了保护。

    如果有证据表明 一次语用 有显著的性能影响,我肯定会开始使用它。

    也就是说-我希望C被定义为只包含一次头-除非调用了某种机制来指示每次包含头时都应该处理它。你想要这种行为的时候是遥远的,远远超过了你不想要的时候(而我仍然时不时地遇到没有警卫或 一次语用 )但这并不是这样定义的,所以包括警卫…

        6
  •  1
  •   Community Mohan Dere    9 年前

    AS Dan McG 说,它们几乎是一样的。但我不建议使用pragma,除非在cant-exchant(如pragma部分)中,它只会使代码更加非标准。

    而且没有功能/性能问题。因为这是编译时间。它 可以 增加编译时间,但我没有体验到任何不同!

        7
  •  1
  •   Matt Curtis    16 年前

    #pragma once 是非标准的。

    如果你对当你发现你的应用或库在你尝试将它移植到不同的平台时,改变你的每一个头文件的前景感到满意,那么这可能是一个不错的选择。

    否则,坚持 #ifndef/#define/#endif . 特别是 如果您正在为其他人构建库代码以供使用。