码迷,mamicode.com
首页 > 其他好文 > 详细

第24课 #pragma使用分析

时间:2018-08-26 14:50:44      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:compile   分享图片   gcc编译   clu   width   参数   技术   turn   bubuko   

#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使用分析

标签:compile   分享图片   gcc编译   clu   width   参数   技术   turn   bubuko   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!