第24课 #pragma 使用分析

1. #pragma简介

(1)#pragma用于指示编译器完成一些特定的动作

(2)#pragma所定义的很多指示字是编译器特有的,在不同的编译器间是不可移植的

  ①预处理器将忽略它不认识的#pragma指令

  ②不同编译器可能以不同的方式解释同一条#pragma指令

(3)一般用法:#pragma parameter //注意,不同的parameter参数语法和意义不同。

2. #pragma message——用于自定义编译消息

(1)message参数在大多数的编译器中都有相似的实现

(2)message参数在编译时输出消息到编译输出窗口

(3)message用于条件编译可提示代码的版本信息

(4)与#error和#warning不同,#pragma message仅仅代表一条编译消息,不代表程序错误。

【实例分析】#pragma message使用示例

#include <stdio.h>

#if defined(ANDROID20)
    #pragma message("Complie Android SDK 2.0...")
    #define VERSION "Android 2.0"
#elif defined(ANDROID23)
    #pragma message("Complie Android SDK 2.3...")
    #define VERSION "Android 2.3"
#elif defined(ANDROID40)
    #pragma message("Complie Android SDK 4.0...")
    #define VERSION "Android 4.0"
#else
    #error Compile Version is not provided!
#endif

int main()
{
    //可用命令行编译:gcc 24-1.c -DANDROID40
    //在gcc下输出:
    //   24-1.c:10: note: #pragma message: Complie Android SDK 4.0...
    //在vc\bcc下输出: Complie Android SDK 4.0...
    printf("%s\n",VERSION);
    return 0;
}

3. #pragma once——用于保证头文件只被编译一次

(1)#pragma once用于保证头文件只被编译一次

(2)#pragma once是编译器相关的,不一定被支持(vc\gcc都支持,bcc不支持!)

(3)#pragma once比#ifndef…#define…#endif效率高,因为后者定义的头文件仍然会被处理。前者只要头文件被定义一次,就不会再次被处理。

【实例分析】#pragma once使用

//global.h

#pragma once

int g_nValue = 1;

//说明:因#pragma once不被所有的编译器支持(如bcc不支持),但
//#pragma once又比#ifndef...#define...#endif效率高,如果
//为了让支持#pragma once的编译器有更高的效率有更高的效率,可以采用如下的头文件定义方式

/*
#pragma once   //当编译器不支持#pragma once时,会直接忽略这行

ifndef  _HEADER_FILE_H_
#define _HEADER_FILE_H_

   //source code

#endif
*/

//24-2.c

#include <stdio.h>
#include "global.h"
#include "global.h" //被include两次

int main()
{

    printf("g_nValue = %d \n",g_nValue); 

    return 0;
}

4. #pragma pack——用于指定内存对齐方式

(1)什么是内存对齐

  ①不同类型的数据在内存中按照一定的规则排列

  ②而不一定是顺序的一个接一个的排列。

【】

(2)为什么需要内存对齐?

  ①CPU对内存的读取不是连续的,而是分成块读取的,块的大小只能是1、2、4、8、16…字节。

  ②当读取操作的数据未对齐,则需要两次总线周期来访问内存,此性能会大打折扣

  ③某些硬件平台只能从规定的相对地址处读取特定类型的数据,否则产生硬件异常

(3)#pragma pack(n)能够改变编译器的默认对齐方式(默认是按4字节对齐)

  ①struc占用的内存大小

    A.第一个成员起始于0偏移处

    B.每个成员以min(sizeof(成员的类型),n)对齐参数进行对齐。即偏移地址必须能被对齐参数整除,在复合结构体中,某个成员(结构体类型)的大小取其内部长度最大的数据成员作为其大小。

  ②结构体总长度必须为所有对齐参数的整数倍

【编程实验】结构体大小计算

5. 小结

(1)#pragma用于指示编译器完成一些特定的动作

(2)#pragma所定义的很多指示字是编译器特有的

时间: 2024-08-16 00:55:44

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

第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 "Andro

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下