【发布时间】:2010-07-11 05:28:15
【问题描述】:
【问题讨论】:
标签: c
【问题讨论】:
标签: c
#ifndef/#define/#endif 技巧适用于任何 C 编译器,并且在其中一些编译器上可以加快编译过程。 #pragma 技巧是非标准的,仅适用于少数 C 编译器,并且可能会导致不支持它的编译器产生不同的语义。
【讨论】:
#ifndef 一种)适用于所有编译器,并且任何人都普遍熟悉知道 C.
#ifndef 的问题。或者,如果该特定常量意外被复制。
#ifndef 中的文件名。 #pragma once 没有任何借口。
区别在于后者是C,而前者不是。永远不要使用#pragma once;始终使用#ifndef。
使用#ifndef 方法时要注意的另一件事是,任何以两个下划线或一个下划线后跟一个大写字母开头的预处理器符号都是保留的,不能使用。您应该使用 #ifndef MYHEADER_H 和 not #ifndef _MYHEADER_H 之类的东西。
【讨论】:
#pragma 是 C;甚至还有一些标准的编译指示。不过,如果您说“不要使用 #pragma once”,那您是正确的。
#pragma once 不是C。它是#pragma 的实现定义使用。
#pragma”是一种过度陈述;标准 C 编译指示有合法和 C99 标准用途 - 具体来说,#pragma STDC FP_CONTRACT ON 是 #pragma 的完美标准和有效使用。但是,正如我之前所说,声明 #pragma once 不是标准的,最好不要使用是正确的。
#pragma once”。我现在已经修好了。
结构
#ifndef MYFOO_H
#define MYFOO_H
/* header information for myfoo.h */
#endif
属于每个头文件。诀窍是:您可以多次包含头文件(意外地),而无需考虑双重声明。所以这是给预处理器的。
#pragma 用于编译器,预处理器应该忽略它不理解的 pragma。
【讨论】:
当您处理一个特定编译器(或一组兼容的编译器)来指导其代码生成时,或者如果您使用标准化的#pragma,如FP_CONTRACT 或@987654324,请使用#pragma @ 任何符合标准的编译器都将支持。
如果您正在处理标准 C(或 C++)预处理器并希望您的代码在所有符合标准的编译器中可移植,请使用 #ifndef 等。
使用任何未在 C(或 C++)标准中定义的 #pragma 会使您的代码不可移植。 #pragma once 有点例外,因为它是非标准 #pragma 构造中最常实现的一种。然而,它的实现在符合标准的编译器中并不通用。 #ifndef 是。
【讨论】: