任何人都可以告诉我在C和Ada中使用pragma,如果可能的话还有一些例子。
C99中有三个标准编译指示:
#pragma STDC FP_CONTRACT on-off-switch
#pragma STDC FENV_ACCESS on-off-switch
#pragma STDC CX_LIMITED_RANGE on-off-switch
“开关关闭”是ON,OFF,DEFAULT之一。
这些可以在编译时用于以神秘的方式修改编译器的行为(这些与C99浮点行为有关)。该标准为标准pragma保留了STDC;其他人可以使用他们喜欢的任何东西。
正如Samuel Klatchko所指出的那样,还有非标准的pragma。
基本上,它们是让编译器以半标准方式执行非标准事物的一种方法。一个例子是'#pragma pack
',这意味着在成员之间没有填充的情况下创建结构,即使这意味着对这些成员的访问将是次优的(空间比时间更重要,可能)。这不是一个特别好的主意(尽管使用它的人会反对);但这是一个普遍认为的要求,因此编译器通常会支持它。
我一直在C编程 - 哦,25年,有点多余。我不需要一次使用pragma。我玩过几次玩具,但从来没有真正需要使用它。也许我很幸运。
在C中,大多数编译指示都是编译器/平台特定的(虽然有些像#pragma once
一样广泛实现)。
这是gcc pragmas的一页和Microsoft VC pragmas的另一页。
在Ada中,“A pragma是编译器指令。”许多是语言的defined,但implementation-defined pragmas是允许的。 Rationale for Ada 2005提供了许多例子。
`#pragma'指令是C标准指定的方法,用于向编译器提供附加信息,超出语言本身传达的内容。 1999 C标准规定了该指令的三种形式(通常称为编译指示)。 C编译器可以自由地将其喜欢的任何含义附加到其他编译指示。
http://gcc.gnu.org/onlinedocs/cpp/Pragmas.html
http://msdn.microsoft.com/en-us/library/d9x1s805%28VS.71%29.aspx
您基本上可以将它们视为编译器的命令。在编译过程中使用这些命令。
例
#include<windows.h>
#pragma comment("lib","shell32.lib")
wmain(){
......
}
在上面的示例中,您基本上要求链接器在链接程序时自动包含shell32.lib。没有它你必须在cl.exe的命令行中手动指定shell32.lib
另一个例子是你可以要求编译器在最终的可执行文件中运行...
#pragma auto_inline(on)
int functionToBeInlined()
{
//.....
}
#pragma auto_inline(off)
将内联所有出现的上述函数。
pragma reference of VC++ compiler
每个编译器都有自己的特定编译指示