#pragma使用分析

#pragma简介

  • #pragma用于指示编译器完成一些特定的动作
  • #pragma所定义的很多指示字是编译器特有的
  • #pragma在不同的编译器间是不可移植的
    • 预处理器将忽略它不认识的#pragma指令
    • 不同的编译器可能以不同的方式解释同一条#pragma指令
  • 一般用法:
    • #pragma parameter

注:不同的parameter参数语法和意义各不相同

#pragma message

  • message参数在大多数的编译器中都有相似的实现
  • message参数在编译时输出消息到编译器输出窗口中
  • message用于条件编译中可提示代码的版本信息

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

#include <stdio.h>  

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

int main()
{
    printf("%s\n", VERSION);  

    return 0;
}  

#pragma once

  • #pragma once用于保证头文件只被编译一次
  • #pragma once是编译器相关的,不一定被支持

这两种方式有什么区别?

通过宏可以保证头文件里的内容只被嵌入一次但可能包含了多次,预处理
器依然处理了多次,所以从效率上说它要打折扣,而pragam once 告诉
预处理器当前文件只被编译一次(即只被include一次,多余的都不会处理),所以它的编译效率会高很多,然而大多数工程使用#ifndef方式,原因在于不是所有的编译器都支持once这个参数,#ifndef是C语言所支持的

例子1:#pragma once使用分析

global.h

#pragma once
int g_value = 1;

main.c

#include<stdio.h>
#include"global.h"
#include"global.h"
int main()
{
    printf("g_value = %d\n",g_value);
    return 0;
}

在有的编译器上支持,有的不支持

实际工作中往往使用如下的方式保证移植性和高效性

#ifndef _GLOBAL_
#define _GLOBAL_

#pragma once

int g_var = 1;
#endif

#pragma pack

  • 什么是内存对齐

    • 不同类型的数据在内存中按照一定的规则排列
    • 而不一定是顺序的一个接一个的排列

12/8

  • 为什么需要内存对齐

    • CPU对内存的读取不是连续的,而是分块读取的
      块的大小只能是1、2、4、8..字节
    • 当读取操作的数据未对齐,则需要两次总线周期来访问内存,因此性能会大打折扣
    • 某些硬件平台只能从规定的相对地址处读取特定类型的数据,否则产生硬件异常
  • #pragma pack用于指定内存对齐方式
    #pragma pack能够改变编译器的默认对齐方式
  • struct占用的内存大小
    • 第一个成员起始于0偏移处
    • 每个成员按照其类型大小和pack参数中较小的一个进行对齐
      偏移地址必须能被对齐参数整除,结构体成员的大小取其内部长度最大的数据成员作为其大小
    • 结构体长度必须为所有对齐参数的整数倍

小结

  • #pragma用于指示编译器完成一些特定的动作
  • #pragma所定义的很多指示字都是编译器特有的
    • #pragma message 用于自定义编译消息
    • #pragma once用于保证头文件只被编译一次
    • #pragma pack用于指定内存对齐方式

原文地址:https://www.cnblogs.com/yanyun888/p/9213145.html

时间: 2024-10-12 07:30:05

#pragma使用分析的相关文章

第24课 #pragma 使用分析

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

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.

第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语言学习笔记---预编译

专题三: 1)       预编译 处理所有的注释,以空格代替, 将所有的#define删除,并且展开所有的宏定义, 处理条件编译指令#if,#ifdef,#elif,#else,#endif 处理#include,展开呗包含的文件, 保留编译器需要使用的#pragma指令, 预处理指令:gcc-E file.c –o hello.i 编译: 对于处理文件进行一系列词法分析,语法分析和语义分析 语法分析主要分析关键字,表示符,立即数是否合法,语法分析主要分析表达式是否遵循语法规则 语义分析子啊语

《C语言进阶剖析》课程目录

<C语言进阶剖析>课程目录 第1课 - 基本数据类型 第2课 - 有符号数与无符号数 第3课 - 浮点数的秘密 第4课 - 类型转换 第5课 - 变量属性 第6课 - 分支语句 第7课 - 循环语句 第8课 - goto和void分析 第9课 - const 和 volatile分析 第10课 - struct和union分析 第11课 - enum, sizeof, typedef 分析 第12课 - 注释符号 第13课 - 接续符和转义符 第14课 - 单引号和双引号 第15课 - 逻辑运

Additinal Dependencies和#pragma comment(lib,&quot;*.lib&quot;)的分析

网上.一些书上也写道,这两种方式作用一样.其实仔细分析,它们两者还是有非常大的差异的. Additinal Dependencies和#pragma comment(lib,"*.lib")都是针对.lib文件的. 而.lib文件其实有两种. 一种是与DLL相关的,描述DLL中的函数入口地址等的,在这里两种方法作用一样. 一种是静态链接库,就是将静态库工程当前所有目标文件编译成一个二进制文件(通常是以.lib为扩展名).Additinal Dependencies和#pragma co

iOS学习之项目流程分析

简易NewsDemo代码分析 界面布局就不多说了.效果图:(自定义了三套Cell,最后一套Cell是页面最下方的"正在加载中..."Cell,图三.)         主要分析工程目录和流程. 第一:Helper中的负责请求数据的网络引擎类. 网络请求类NetworkEngine主要完成数据请求的任务.用来简化控制器中的代码.将数据单独存放. 实现步骤分析: .h文件中: 1.分析完成网络请求需要:①请求的网址 ②请求的参数 ③请求的方式(GET或者POST). 那么将这三个定义为属性

【OpenGL】Shader实例分析(七)- 雪花飘落效果

转发请保持地址:http://blog.csdn.net/stalendp/article/details/40624603 研究了一个雪花飘落效果.感觉挺不错的.分享给大家,效果例如以下: 代码例如以下: Shader "shadertoy/Flakes" { // https://www.shadertoy.com/view/4d2Xzc Properties{ iMouse ("Mouse Pos", Vector) = (100,100,0,0) iChan

基于OpenMP的矩阵乘法实现及效率提升分析

一.  矩阵乘法串行实现 例子选择两个1024*1024的矩阵相乘,根据矩阵乘法运算得到运算结果.其中,两个矩阵中的数为double类型,初值由随机数函数产生.代码如下: #include <iostream> #include <omp.h> // OpenMP编程需要包含的头文件 #include <time.h> #include <stdlib.h> using namespace std; #define MatrixOrder 1024 #def