第24课 #pragma使用分析

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第24课 #pragma使用分析相关的知识,希望对你有一定的参考价值。

#pragma是C语言留给编译器厂商进行扩展用的。

这个关键字在不同的编译器之间也许是不能够移植的。

#pragma简介

技术分享图片

 

#pragma message

技术分享图片

 

#pragma message打印的消息并不代表代码有什么问题。

示例:

 1 #include <stdio.h>
 2 
 3 #if defined(android20)
 4     #pragma message("Compile Android SDK 2.0...")
 5     #define VERSION "Android 2.0"
 6 #elif defined(ANDROID23)
 7     #pragma message("Compile Android SDK 2.3...")
 8     #define VERSION "Android 2.3"
 9 #elif defined(ANDROID40)
10     #pragma message("Compile Android SDK 4.0...")
11     #define VERSION "Android 4.0"
12 #else
13     #error Compile Version is not provided!
14 #endif
15 
16 int main()
17 {
18     printf("%s
", VERSION);
19 
20     return 0;
21 }

编译命令如下:

技术分享图片

 

可见,在编译期间,预处理器处理#pragma message,并输出信息。

将上述程序用vc编译器进行编译,结果如下:

技术分享图片

 

输出和gcc只有略微的差别。

bcc32的编译输出如下:

技术分享图片

 

 

#pragma once

技术分享图片

 

左边是通过判断宏是否已经定义的方式保证代码只被嵌入一次,预处理器还是处理了这个文件。而#pragma once 保证只处理这个要包含的文件一次。所有pragma once的效率会高一点。

 工程中用的比较多的是ifndef方式,而不是pragma方式,因为并不是所有的编译器都支持pragma once。而ifndef是C语言支持的。

pragma once使用示例:

test.c

 1 #include <stdio.h>
 2 #include "global.h"
 3 #include "global.h"
 4 
 5 int main()
 6 {
 7     printf("g_value = %d
", g_value);
 8 
 9     return 0;
10 }

global.h

1 #pragma once
2 
3 int g_value = 1;

gcc编译运行结果如下:

技术分享图片

 

注释掉pragma once后,gcc就会报重定义错误。

vc2010编译运行结果如下:

技术分享图片

 

bcc32的编译如下:

技术分享图片

 

可见bcc并不支持pragma once。预处理器不支持的pragma参数,会直接删除pragma once这一行。

工程中可以使用以下的解决方案:

技术分享图片

 

这样可以保证只包含一次,又保证效率。在不支持pragma once的编译器中,还有ifndef做保证。在支持pragma once 的编译器中,它就起作用了,保证文件只被包含一次,也只被处理一次。

 

pragma pack:

技术分享图片

 

 

以上是关于第24课 #pragma使用分析的主要内容,如果未能解决你的问题,请参考以下文章

第19课 编译过程简介

第22课 条件编译使用分析

第55课: 在线广告点击流处理代码的分析和实现

第24课:直接传递

#pragma使用分析

第0-0课 - 引言