C语言#pragma指令用法

来源:文书网 1.75W

引导语:在所有的预处理指令中,#Pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。以下是本站小编分享给大家的C语言#pragma指令用法,欢迎阅读!

C语言#pragma指令用法

#pragma

#pragma GCC dependency 文件名

表示当前文件依赖于指定的文件,如果当前文件的最后一次,修改的时间早于依赖的文件,则产生警告信息

#include

//当前程序依赖于01print.c文件

#pragma GCC dependency "01print.c"

int main(void)

{

printf("Good Good Study,Day Day Up!n");

return 0;

}

输出结果:

致命错误: 01print.c:没有那个文件或目录

编译中断。

#pragma GCC poison 标示符

表示将后面的标示符设置成毒药,一旦使用标示符,则产生错误或警告信息

//毒药的设置

#include

//#define GOTO goto

//将goto设置为毒药

#pragma GCC poison goto

int main(void)

{

//GOTO ok;

goto ok;

printf("main函数开始n");

ok:

printf("main函数结束n");

return 0;

}

输出结果:

错误: 试图使用有毒的“goto”

#pragma pack (整数n)

表示按照整数n倍进行补齐和对齐

//设置结构体的对齐和补齐方式

#include

//设置结构体按照2的整数倍进行对齐补齐

#pragma pack(2) //8

//#pragma pack(1) //6

//#pragma pack(3) //error

//char short int long int long long

int main(void)

{

struct S

{

char c1;

int i;

char c2;

};

printf("sizeof(struct S) = %dn",sizeof(struct S));//12

return 0;

}

输出结果:

sizeof(struct S) = 8

#pragma message

message 参数: message 参数是我最喜欢的一个参数,它能够在编译信息输出窗,口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:

#pragma message(“消息文本”)

当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86 这个宏可以用下面的方法.

#define _X86

#ifdef _X86

#pragma message ("_X86 macro activated!")

#endif

输出结果:

附注: #pragma message:_X86 macro activated!

当我们定义了_X86 这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了.

#pragma code_seg

另一个使用得比较多的 pragma 参数是 code_seg。格式如:

#pragma code_seg( ["section-name"[,"section-class"] ] )

它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。

#pragma once

#pragma once (比较常用)

只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在Visual C++6.0 中就已经有了,但是考虑到兼容性并没有太多的使用它。

#pragma hdrstop

#pragma hdrstop 表示预编译头文件到此为止,后面的头文件不进行预编译。 BCB 可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。有时单元之间有依赖关系,比如单元 A 依赖单元 B,所以单元 B 要先于单元 A 编译。你可以用#pragma startup 指定编译优先级,如果使用了#pragma package(smart_init) , BCB就会根据优先级的大小先后编译。

#pragma resource

#pragma resource "*"表示把* 文件中的资源加入工程。 * 中包括窗体外观的'定义。

#pragma warning

#pragma warning( disable : 4507 34; once : 4385; error : 164 )

等价于:

#pragma warning(disable:4507 34) // 不显示 4507 和 34 号警告信息

#pragma warning(once:4385) // 4385 号警告信息仅报告一次

#pragma warning(error:164) // 把 164 号警告信息作为一个错误。

同时这个 pragma warning 也支持如下格式:

#pragma warning( push [ ,n ] )

#pragma warning( pop )

这里 n 代表一个警告等级(1---4)。

#pragma warning( push )保存所有警告信息的现有的警告状态。

#pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告等级设定为 n。

#pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。例如:

#pragma warning( push )

#pragma warning( disable : 4705 )

#pragma warning( disable : 4706 )

#pragma warning( disable : 4707 )

//.......

#pragma warning( pop )

在这段代码的最后,重新保存所有的警告信息(包括 4705, 4706 和 4707)。

#pragma comment

#pragma comment(...)

该指令将一个注释记录放入一个对象文件或可执行文件中。常用的 lib 关键字,可以帮我们连入一个库文件。 比如:

#pragma comment(lib, "")

该指令用来将 库文件加入到本工程中。linker:将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或者在开发环境中设置的链接选项,你可以指定/include 选项来强制包含某个对象,例如:

#pragma comment(linker, "/include:__mySymbol")

热门标签