第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\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:

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

时间: 2024-10-19 01:45:30

第24课 #pragma使用分析的相关文章

第24课 #pragma 使用分析

1. #pragma简介 (1)#pragma用于指示编译器完成一些特定的动作 (2)#pragma所定义的很多指示字是编译器特有的,在不同的编译器间是不可移植的 ①预处理器将忽略它不认识的#pragma指令 ②不同编译器可能以不同的方式解释同一条#pragma指令 (3)一般用法:#pragma parameter //注意,不同的parameter参数语法和意义不同. 2. #pragma message——用于自定义编译消息 (1)message参数在大多数的编译器中都有相似的实现 (2)

C++--第24课 - 专题四经典问题解析

第24课 - 专题四经典问题解析 1. 历史的痕迹 #include <cstdlib> #include <iostream> using namespace std; template<class T>  //以前是用typename定义,现在是用class定义 T Minus(T a, T b) { return a - b; } template<class T>  //类模板 class Add { public: T add(T a, T b)

【自动语音识别课程】第二课 语音信号分析

[传送门] [自动语音识别课程]第一课 统计语音识别介绍 原文地址:http://blog.csdn.net/joey_su/article/details/36414877 转载请注明出处,欢迎交流. 概述 针对ASR的语音信号分析 特征 频谱分析 倒谱分析 标准特征:MFCC和PLP分析 动态特征 第一课的结尾提到了语音识别的框图,下图展示了信号分析技术在语音识别系统中的位置: 我们先来认识下语音的产生过程: 语音是在发音器官和声道共同作用下产生的.说话时,声带振动发出具有一定周期特性(基音

【Cocos游戏实战】功夫小子第二课之基础类分析和实现

本节课的视频教程地址是:第二课在此 如果本教程有帮助带您,希望您能点击进去观看一下,而且现在注册成为极客学院的会员,验证手机号码和邮箱号码会赠送三天的会员时间,会员可以无限制的下载和观看所有的视频,谢谢您的支持! 在开始第二节课之前,这里需要声明的是, 首先:本系列课程是为了结合Cocos2d-x 3.x 的基本组件和核心模块的学习而制作的,开发所使用的版本是3.0,但是代码稍加修改就可以运用在3.X的其他版本上. 其次:本游戏项目是一个非商业化项目,游戏资源和代码都会在后续的课程中释放出来,供

2015-11-25 #pragma预处理分析听课笔记

1.#pragma是编译器指示字,用于指示编译器完成一些特定的动作. 2.#pragma定义的很多指示字都是编译器和系统特有的. 3.#pragma在不同的编译器之间是不可移植的. 3.1  预处理器将忽略它所不认识的#pragma指令 3.2两个不同的编译器可能会以两种不同的方式解释同一条#pragma指令,这是由编译器厂商决定的. 4.一般用法: #pragma   parameter  //不同的parameter参数语法和意义各不相同. 4.1   #pragma  message 4.

第50课 C++对象模型分析(上)

1. 回归本质 (1)class是一种特殊的结构体 ①在内存中class依旧可以看作变量的集合 ②class与struct遵循相同的内存对齐规则 ③class中的成员函数与成员变量是分开存放的.即每个对象有独立的成员变量,但所有对象共享类中的成员函数. [编程实验]对象内存布局初探 #include <iostream> #include <string> using namespace std; class A { //默认访问权限为private int i; int j; c

#pragma使用分析

#pragma简介 #pragma用于指示编译器完成一些特定的动作 #pragma所定义的很多指示字是编译器特有的 #pragma在不同的编译器间是不可移植的 预处理器将忽略它不认识的#pragma指令 不同的编译器可能以不同的方式解释同一条#pragma指令 一般用法: #pragma parameter 注:不同的parameter参数语法和意义各不相同 #pragma message message参数在大多数的编译器中都有相似的实现 message参数在编译时输出消息到编译器输出窗口中

第51课 C++对象模型分析(下)

1. 单继承对象模型 (1)单一继承 [编程实验]继承对象模型初探 #include <iostream> using namespace std; class Demo { protected: int mi; int mj; public: //虚函数 virtual void print() { cout << "mi = " << mi << ", " << "mj = " &l

第17课 ++和--操作符分析

1. ++和—操作符对应的两条汇编指令 (1)前置++或--:变量自增(减)1,然后取变量值 (2)后置++或--:取变量值,然后变量自增(减)1 [实例分析]一对令人头疼的兄弟 #include <stdio.h> int main() { int i = 0; int r = 0; r = (i++) + (i++) + (i++); printf("i = %d\n", i); //i等于3 printf("r = %d\n", r); //vc下