#pragma和#ifndef有什么区别?

时间:2010-07-11 05:28:16

标签: c

  

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

我应该何时使用#pragma once

我应该何时使用#ifndef HEADER_H_INCLUDED

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:3)

不同之处在于后者是C而前者不是。切勿使用#pragma once;始终使用#ifndef

使用#ifndef方法时需要注意的另一点是,任何以两个下划线开头的预处理程序符号或后跟大写字母的下划线都是保留且无法使用。您应该使用#ifndef MYHEADER_H #ifndef _MYHEADER_H等内容。

答案 2 :(得分:1)

当您使用特定编译器(或一组兼容编译器)来指导其代码生成时,或者如果您使用标准#pragma之类的#pragma,请使用FP_CONTRACT 1}}或-CX_LIMITED_RANGE-任何符合标准的编译器都支持。

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

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

答案 3 :(得分:0)

构造

myfoo.h

#ifndef MYFOO_H
#define MYFOO_H

/* header information for myfoo.h */

#endif

属于每个头文件。诀窍是:你可以多次包含一个头文件(不小心)而不用考虑双重声明。所以这是预处理器。

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