使用 #pragma once 或 #ifndef #endif 哪个更有效?

Posted

技术标签:

【中文标题】使用 #pragma once 或 #ifndef #endif 哪个更有效?【英文标题】:Which is efficient to use #pragma once or #ifndef #endif? 【发布时间】:2011-04-04 10:16:06 【问题描述】:

为了避免头文件的多次包含,我的一位朋友建议以下方式

  #ifndef _INTERFACEMESSAGE_HPP
  #define _INTERFACEMESSAGE_HPP
  class CInterfaceMessage
  
     / /Declaration of class goes here
  //i.e declaration of member variables and methods 
   private:
   int m_nCount;
     CString m_cStrMessage;
    public:
    CString foo(int);
 
   #endif

其中 _INTERFACEMESSAGE_HPP 只是一个标识符

但是当我使用 Visual Studio 2005 IDE 声明一个类时,我得到一个声明 #pragma 一次 在类定义的开头 当我在 msdn 的帮助下找到 #pragma 的目的时 它给了我以下解释

"指定编译器在编译源代码文件时只包含(打开)一次文件。"

有人请告诉哪种方法是正确的?,如果两者都是正确的,那么有什么区别?一种方法比另一种更好吗?

【问题讨论】:

请勿使用以下划线后跟大写字母开头的标识符,它们是保留的。 【参考方案1】:

gcc 已弃用了一次编译指示。您应该使用标准的包含警卫。所有 pragma 指令都是根据定义实现定义的。因此,如果您想要便携性,请不要使用它们。

【讨论】:

自 gcc 3.4 起不再不推荐使用,请参阅 gcc.gnu.org/gcc-3.4/changes.html【参考方案2】:

编译指示是特定于编译器的,所以我会使用#ifndef

预处理器指令在编译期间(实际上是在编译之前)被解析,因此除了编译时间之外,它们不会在运行时产生影响。

但是,除非我猜你使用了数千次,否则你永远不会注意到这两种替代方案在编译时间上的差异。

【讨论】:

【参考方案3】:

第一种方法是适用于所有编译器的通用方法,也是较旧的方法。 #pragma once 方法是特定于编译器的。

【讨论】:

以上是关于使用 #pragma once 或 #ifndef #endif 哪个更有效?的主要内容,如果未能解决你的问题,请参考以下文章

#pragma once vs #ifndef

#pragma once与 #ifndef的区别

#pragma once与#ifndef的区别

C++# pragma once 与 # ifndef

#pragma once与 #ifndef的区别

#ifndef三件套与#pragma once