首页 > 其他 > 详细

第24课 #pragma使用分析

时间:2018-08-26 14:28:47      阅读:193      评论:0      收藏:0      [点我收藏+]

#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\n", 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\n", 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使用分析

原文:https://www.cnblogs.com/wanmeishenghuo/p/9537245.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!