首页 > 其他分享 >C语言 #pragma指令

C语言 #pragma指令

时间:2023-06-08 23:37:38浏览次数:52  
标签:struct C语言 编译器 指令 pragma 对齐 Android pack

简介

#pragma 指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的, 且对于每个编译器都是不同的
#pragma 用于指示编译器完成一些特定的动作
#pragma 所定义的很多指示字是编译器特有的
#pragma 在不同的编译器间是不可移植的
预处理器将忽略它不认识的 #pragma 指令
不同的编译器可能以不同的方式解释同一条 #pragma 指令

一般用法: 

#pragma parameter

#pragma message

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

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

#include <stdio.h>

#define ANDROID20

#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

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

#ifndef _GTC_CORE_H_INCLUDED_
#define _GTC_CORE_H_INCLUDED_
  
#endif

该模式被C语言支持,但是并非只包含一次头文件而是包含多次,然后通过宏控制是否嵌入到源代码中,预处理器在其中处理了多次,效率上不如 #pragma once
但是 #pragma once 不一定所有编译器都支持,因此提供如下写法

#ifndef _GTC_CORE_H_INCLUDED_
#define _GTC_CORE_H_INCLUDED_
  
#pragma once
  
#endif

#pragma pack

指定数据在内存中的对齐方式

#pragma pack(n)
编译器将按照n个字节对齐

#pragma pack()
取消自定义字节对齐方式

#pragma pack(push,1)
是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐

#pragma pack(pop)
恢复对齐状态

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma pack(4)

struct Test1
{
    char m1;
    double m2;
    int m3;
};

#pragma pack()

struct Test2
{
    char m1;
    double m2;
    int m3;
};


int main(int argc, char* argv[])
{
    printf("sizeof(struct Test1): %d\n", sizeof(struct Test1));    // 打印 16
    printf("sizeof(struct Test2): %d\n", sizeof(struct Test2));    // 打印 24
    return 0;
}

 

标签:struct,C语言,编译器,指令,pragma,对齐,Android,pack
From: https://www.cnblogs.com/zhanggaofeng/p/17467947.html

相关文章

  • 逍遥自在学C语言 | 枚举的那些事儿
    前言在C语言中,枚举是一种方便组织和表示一组相关常量的工具。枚举类型有助于提高代码的可读性和可维护性。本文将介绍C语言枚举的基本概念、语法和用法,以及一些高级技巧。一、人物简介第一位闪亮登场,有请今后会一直教我们C语言的老师——自在。第二位上场的是和我们一起......
  • C语言编程—头文件
    头文件是扩展名为.h的文件,包含了C函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。在程序中要使用头文件,需要使用C预处理指令#include来引用它。前面我们已经看过stdio.h头文件,它是编译器自带的头文件。引用头文件......
  • apache 使用 mod_fcgid.so模块时 配置指令
    FcgidBusyScanInterval指令说明:扫描繁忙超时进程的间隔语法: FcgidBusyScanInterval seconds默认:FcgidBusyScanInterval120环境: 服务器配置状态:外部对应的老指令:BusyScanInterval该模块将执行FcgidBusyTimeout检查,在此区间。FcgidBusyTimeout指令说明:杀死处理请求超过Fcgi......
  • c语言函数
    #include<iostream>floataverage();//主函数在前需要申明intmain(){floatx;x=average();printf("平均值为:%5.2f\n",x);return0;}floataverage(){floatx1,x2,x3,x4,x5;printf("请输入五个数:");scanf_s(&quo......
  • C语言中的强制转换
    一、数组类型强转为结构体类型CMD    len      addr       data1Byte   2Byte    4Byte    05  f401   20000000   1112......................(共500字节)  -------串口收到......
  • 谈一谈冷门的C语言爬虫
    C语言可以用来编写爬虫程序,但是相对于其他编程语言,C语言的爬虫开发可能会更加复杂和繁琐。因为C语言本身并没有提供现成的爬虫框架和库,需要自己编写网络请求、HTML解析等功能。不过,如果你对C语言比较熟悉,也可以尝试使用C语言编写爬虫程序,这样可以更好地掌握爬虫的底层原理和实现方......
  • 谈一谈冷门的C语言爬虫
    C语言可以用来编写爬虫程序,但是相对于其他编程语言,C语言的爬虫开发可能会更加复杂和繁琐。因为C语言本身并没有提供现成的爬虫框架和库,需要自己编写网络请求、HTML解析等功能。不过,如果你对C语言比较熟悉,也可以尝试使用C语言编写爬虫程序,这样可以更好地掌握爬虫的底层原理和实现......
  • 初识C语言:从0开始,由菜鸟变大牛(完结)
    上篇内容分享了两种语句(选择语句、循环语句)、函数、数组、各种操作符,本篇文章我们再来了解关于初识C语言的内容,同样,涉及到的知识不会太复杂,废话不多说,正文开始:1.常见关键字autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatf......
  • C语言编程—预处理器
    预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把C预处理器(CPreprocessor)简写为CPP。所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了......
  • 计算机组成原理:指令系统、CPU数据通路信号(例题
    分析:由题目可知操作码占4位,所以支持的操作指令为\(2^4\)种指令操作数占6位,其中寻址3位,寄存器编号3位,所以最多有\(2^3\)个通用寄存器主存大小为128KB,机器字长为16位,且按字编址,所以有\(\frac{128KB}{2B}\quad=2^{16}\)个存储单元,即MAR至少16位机器字长为16为,那么MDR至少也......