【问题标题】:What's difference between #pragma and #ifndef? [duplicate]#pragma 和 #ifndef 有什么区别? [复制]
【发布时间】:2010-07-11 05:28:15
【问题描述】:

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

什么时候应该使用#pragma once

什么时候应该使用#ifndef HEADER_H_INCLUDED

【问题讨论】:

    标签: c


    【解决方案1】:

    #ifndef/#define/#endif 技巧适用于任何 C 编译器,并且在其中一些编译器上可以加快编译过程。 #pragma 技巧是非标准的,仅适用于少数 C 编译器,并且可能会导致不支持它的编译器产生不同的语义。

    【讨论】:

    • 请注意,它在三大巨头:GCC、MSVC 和 ICC 上都受支持。
    • 即使除了一个以外的所有人都支持它,使用它仍然是愚蠢的,因为有一种简单的方法(#ifndef 一种)适用于所有编译器,并且任何人都普遍熟悉知道 C.
    • @R:除非你(也许还有你的团队,他们都使用相同的编译器)是项目中唯一的人。过去我曾遇到过重命名头文件但忘记更新#ifndef 的问题。或者,如果该特定常量意外被复制。
    • @Mark:随意使用 UUID 或只是一些随机字符串,后跟最初创建标头的确切日期和时间,而不是 #ifndef 中的文件名。 #pragma once 没有任何借口。
    • 即使您团队当前的编译器支持非标准扩展,您未来的编译器也会支持吗?这就是非标准内容的风险所在。
    【解决方案2】:

    区别在于后者是C,而前者不是。永远不要使用#pragma once;始终使用#ifndef

    使用#ifndef 方法时要注意的另一件事是,任何以两个下划线或一个下划线后跟一个大写字母开头的预处理器符号都是保留的,不能使用。您应该使用 #ifndef MYHEADER_Hnot #ifndef _MYHEADER_H 之类的东西。

    【讨论】:

    • 严格来说,#pragma 是 C;甚至还有一些标准的编译指示。不过,如果您说“不要使用 #pragma once”,那您是正确的。
    • 但是#pragma once 不是C。它是#pragma 的实现定义使用。
    • 我的意思是,您的陈述“从不使用#pragma”是一种过度陈述;标准 C 编译指示有合法和 C99 标准用途 - 具体来说,#pragma STDC FP_CONTRACT ON#pragma 的完美标准和有效使用。但是,正如我之前所说,声明 #pragma once 不是标准的,最好不要使用是正确的。
    • 我的意思是“永远不要使用#pragma once”。我现在已经修好了。
    【解决方案3】:

    结构

    myfoo.h

    #ifndef MYFOO_H
    #define MYFOO_H
    
    /* header information for myfoo.h */
    
    #endif
    

    属于每个头文件。诀窍是:您可以多次包含头文件(意外地),而无需考虑双重声明。所以这是给预处理器的。

    #pragma 用于编译器,预处理器应该忽略它不理解的 pragma。

    【讨论】:

    • 我不会称之为“意外”。头文件 B 和 C 更有可能都依赖于头文件 A,因此都包含它。那么,如果一个源文件同时包含头文件 B 和 C,那么它将因此包含头文件 A 两次。
    【解决方案4】:

    当您处理一个特定编译器(或一组兼容的编译器)来指导其代码生成时,或者如果您使用标准化的#pragma,如FP_CONTRACT 或@987654324,请使用#pragma @ 任何符合标准的编译器都将支持。

    如果您正在处理标准 C(或 C++)预处理器并希望您的代码在所有符合标准的编译器中可移植,请使用 #ifndef 等。

    使用任何未在 C(或 C++)标准中定义的 #pragma 会使您的代码不可移植。 #pragma once 有点例外,因为它是非标准 #pragma 构造中最常实现的一种。然而,它的实现在符合标准的编译器中并不通用。 #ifndef 是。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-19
      • 2015-11-23
      • 2013-02-13
      • 2011-04-26
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多