使用 #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 哪个更有效?的主要内容,如果未能解决你的问题,请参考以下文章