C语言进阶课程学习记录-第24课 - #pragma 使用分析

C语言进阶课程学习记录-第24课 - #pragma 使用分析

    • #pragma
    • 实验-#pragma message
      • cmd窗口运行
    • 实验-pragma once
      • bcc编译报错
      • gcc编译成功
      • global.h代码优化
    • #pragma pack
    • 实验
      • BCC编译器输出
    • 小结

本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程,图片全部来源于课程PPT,仅用于个人学习记录

#pragma

在这里插入图片描述
在这里插入图片描述

实验-#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!
#endifint main()
{printf("%s\n", VERSION);return 0;
}

cmd窗口运行

D:\Users\cy\Cxuexi\gccLearn\24-1>gcc 24-1.c
24-1.c:13:6: error: #error Compile Version is not provided!#error Compile Version is not provided!^~~~~
24-1.c: In function 'main':
24-1.c:18:20: error: 'VERSION' undeclared (first use in this function)printf("%s\n", VERSION);^~~~~~~
24-1.c:18:20: note: each undeclared identifier is reported only once for each function it appears inD:\Users\cy\Cxuexi\gccLearn\24-1>gcc -DANDROID20 24-1.c
24-1.c:4:13: note: #pragma message: Compile Android SDK 2.0...#pragma message("Compile Android SDK 2.0...")^~~~~~~D:\Users\cy\Cxuexi\gccLearn\24-1>gcc -DANDROID23 24-1.c
24-1.c:7:13: note: #pragma message: Compile Android SDK 2.3...#pragma message("Compile Android SDK 2.3...")^~~~~~~D:\Users\cyz1994\Cxuexi\gccLearn\24-1>a.exe
Android 2.3

在这里插入图片描述

实验-pragma once

//global.h
#pragma once//不是所有编译器都支持此命令int g_value = 1;
#include <stdio.h>
#include "global.h"
#include "global.h"int main()
{printf("g_value = %d\n", g_value);return 0;
}

bcc编译报错

在这里插入图片描述

gcc编译成功

D:\Users\cy\Cxuexi\gccLearn\test>gcc test.cD:\Users\cy\Cxuexi\gccLearn\test>a.exe
g_value = 1

global.h代码优化

//global.h
#ifndef _GLOBAL_H_//防止编译器不支持,添加条件编译
#def _GLOBAL_H_
#pragma once//int g_value = 1;
#endif

#pragma pack

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#pragma pack(4)
struct Test1
{				//对齐参数  偏移地址 大小char  c1;	//1        0		1short s;	//2        2		2char  c2;	//1        4		1int   i;	//4        8		4
};
#pragma pack()

对齐参数 =min(pack内部数字,数据类型字节数)
偏移地址必须是对齐参数的整数倍
大小=数据类型字节数

实验

#include <stdio.h>#pragma pack(2)
struct Test1
{             //对齐参数  偏移地址 大小char  c1;   //1        0		1short s;    //2      2     2char  c2;   //1     4      1int   i;    //2     6      4
};
#pragma pack()#pragma pack(4)
struct Test2
{				//对齐参数  偏移地址 大小char  c1;	//1        0		1char  c2;	//1        1		1short s;	//2        2		2int   i;	//4        4		4
};
#pragma pack()int main()
{printf("sizeof(Test1) = %d\n", sizeof(struct Test1));printf("sizeof(Test2) = %d\n", sizeof(struct Test2));return 0;
}/*
output:
sizeof(Test1) = 10
sizeof(Test2) = 8*/
#include <stdio.h>#pragma pack(8)//有些编译器不支持,采取默认字节对齐struct S1
{			//对齐参数  偏移地址 大小short a;//2     0       2long b;	//4     4       4
};struct S2
{char c; 	//1		0	1struct S1 d;// 8    8    8double e;   //8     16   8
};#pragma pack()int main()
{printf("%d\n", sizeof(struct S1));printf("%d\n", sizeof(struct S2));return 0;
}
/*output:
8
24
*/

BCC编译器输出

在这里插入图片描述

小结

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

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

  • #pragma message用于自定义编译消息
  • #pragma once用于保证头文件只被编译一次
  • #pragma pack用于指定内存对齐方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/597599.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【办公类-48-02】20240407每月电子屏台账汇总成docx-2(腾讯文档xlsx导入docx,每页20条)

作品展示 背景需求&#xff1a; 安全主任再次催交台账 一分园老师发的是链接版——这是我原来制作的在线共享填写“腾讯文档”。但是感觉手机竖版填写起来不方便&#xff0c;&#xff08;表格是横版的&#xff0c;要向右滑动点击格子&#xff0c;填起来容易错行&#xff09;&a…

实现 3D 数字时钟

3D 数字时钟实现 效果展示 CSS / JavaScript 知识点 box-shadow 属性运用&#xff0c;实现 3D 效果的数字时钟transform 属性灵活运用&#xff0c;实现数值时钟上的数字部分JavaScript Date()对象的运用 页面整体布局 <div class"clock"><!-- 时钟仪表盘…

纯小白蓝桥杯备赛笔记--DAY9(动态规划)

文章目录 一、动态规划基础&#xff08;1&#xff09;线性DP简介步骤例题数字三角形--1536破损的楼梯-3367安全序列-3423 &#xff08;2&#xff09;二维DP简介例题摆花--389选数异或--3711数字三角形--505 &#xff08;3&#xff09;最长公共子序列LCSLCS算法模型最长公共子序…

智慧公厕升级为多功能城市智慧驿站,助力智慧城市发展

在现代城市的建设中&#xff0c;公共厕所作为基础必备的民生设施&#xff0c;一直是城市管理的重要组成部分。随着科技的不断发展&#xff0c;智慧公厕应运而生&#xff0c;成为了公共厕所信息化、数字化、智慧化的应用解决方案。而近年来&#xff0c;智慧公厕也进行了升级发展…

精品丨PowerBI负载测试和容量规划

当选择Power BI作为业务报表平台时&#xff0c;如何判断许可证的选择是否符合业务需求&#xff0c;价格占了主导因素。 Power BI的定价是基于SKU和服务器内核决定的&#xff0c;但是很多IT的负责人都不确定自己公司业务具体需要多少。 不幸的是&#xff0c;Power BI的容量和预期…

Redis的高可用和持久化

目录 一、Redis高可用 二、Redis持久化 2.1 持久化的功能 2.2 Redis提供两种方式进行持久化 三、RDB持久化 3.1 触发条件 3.1.1 手动触发 3.1.2 自动触发 3.1.3 其他自动触发机制 四、AOF持久化 4.1 开启AOF 4.2 执行流程 4.2.1 命令追加 (append) 4.2.2 文件写入…

FANUC机器人基础数据类型

FANUC机器人KAREL基本数据类型有下述几种&#xff1a; FANUC常量机器人申明示例&#xff1a; FANUC变量申明的语法表&#xff1a; FANUC机器人的存储模式&#xff1a; DREM&#xff1a;关机后清空内存数据 CMOS&#xff1a;断电保持&#xff0c;不清空被赋值后的数据 如果不…

前端零基础学习web3开发

目录 1 钱包 2 发起交易 3 出块 4 块高 5 矿工 6 Gas费 这一节&#xff0c;我们不说让人神往的比特币&#xff0c;不说自己会不会利用这个虚拟的货币来发财&#xff0c;也不说那些模模糊糊的知识&#xff0c;什么去中心化啦&#xff0c;什么奇妙的加密啦&#xff0c;我们…

吴恩达:AI 智能体工作流

热门文章推荐&#xff1a; &#xff08;1&#xff09;《为什么很多人工作 3 年 却只有 1 年经验&#xff1f;》&#xff08;2&#xff09;《一文掌握大模型提示词技巧&#xff1a;从战略到战术巧》&#xff08;3&#xff09;《AI 时代&#xff0c;程序员的出路在何方&#xff1…

pandas用法-详解教程

pandas用法-详解教程 一、生成数据表二、数据表信息查看三、数据表清洗四、数据预处理五、数据提取六、数据筛选七、数据汇总八、数据统计九、数据输出 一、生成数据表 1、首先导入pandas库&#xff0c;一般都会用到numpy库&#xff0c;所以我们先导入备用&#xff1a; impor…

掌握 JMeter 参数化测试,提升应用性能测试水平!

本周给大家介绍下如何测试工具Jmeter中的参数化 随着互联网的快速发展&#xff0c;性能测试已成为每个应用程序不可或缺的一部分。Apache JMeter 是一款广泛使用的开源性能测试工具&#xff0c;可以帮助我们模拟并发用户对目标服务器发起请求&#xff0c;以评估系统的性能。在…

通用分布式锁组件

通用分布式锁组件 1 Redisson1.1介绍1.2 为什么要使用Redisson实现分布式锁1.2.1 锁续期的问题1.2.2 获取锁尝试的问题1.2.3 可重入问题 1.3 Wath Dog的自动延期机制1.4 快速了解1.5 项目集成 2 定义通用分布式锁组件2.1 实现思路分析2.2 定义注解2.3 定义切面2.4 使用锁2.5.工…