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!
#endif

int 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 in


D:\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.c

D:\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		1
    short s;	//2        2		2
    char  c2;	//1        4		1
    int   i;	//4        8		4
};
#pragma pack()

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

实验

#include <stdio.h>

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

#pragma pack(4)
struct Test2
{				//对齐参数  偏移地址 大小
    char  c1;	//1        0		1
    char  c2;	//1        1		1
    short s;	//2        2		2
    int   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       2
    long b;	//4     4       4
};

struct S2
{
    char c; 	//1		0	1
    struct S1 d;// 8    8    8
    double 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用于指定内存对齐方式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

特征提取算法

特征提取算法 0. 写在前边1. Harris算法1.1 写在前面1.2 Harris算法的本质1.3 Harris算法的简化 2. Harris3D2.1 Harris3D算法问题定义2.2 Harris3D with intensity2.3 Harris3D without intensity 3. ISS特征点的应用 0. 写在前边 本篇将介绍几种特征提取算法&#xff0c;特征…

服务器数据恢复—EqualLogic PS6100系列存储数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌EqualLogic PS6100系列存储阵列是一款容错功能较强的存储设备&#xff0c;具有较高的安全性能。一些硬件故障或者误操作也会破坏该系列存储内的数据&#xff0c;下面分享一个北亚企安数据恢复工程师接到的一个关于EQ PS6100存储的数据恢复…

java学习之线程池

java线程池优点&#xff1a; 降低线程创建和销毁的开销&#xff0c;提高系统性能。 提高线程的利用率和系统的吞吐量。 统一线程的管理和监控&#xff0c;避免线程泄漏和线程安全问题。 支持任务队列和拒绝策略等机制&#xff0c;提供灵活的任务调度和任务处理能力。 并不…

【网络安全之渗透测试】公开课-即将开始

​4月13日&#xff0c;下午一点&#xff0c;网络安全-渗透公开课&#xff0c;感兴趣的可以留言免费参加 &#x1f525;&#x1f525;&#x1f525;大新闻来啦&#xff01;各位网络安全爱好者、IT从业者、或者是想要保护自己的数字生活的小伙伴们&#xff0c;注意了&#xff01;…

利驰软件荣获2023年度中国智能制造优秀供应商及优秀推荐产品奖

2024年3月28-29日&#xff0c;由e-works数字化企业网主办的“第十三届中国智能制造高峰论坛暨第二十一届中国智能制造岁末盘点颁奖典礼”于北京西南华邑酒店召开。 大会邀请了中国工程院院士、阿里研究院副院长、国家智能制造专家委员会委员等行业专家&#xff0c;以及国内外知…

银行ITSS体系下低代码运维体系实践分享

前言 自2021年中国人民银行发布《金融科技发展规划&#xff08;2022-2025年&#xff09;》以来&#xff0c;商业银行迈入数字化转型的高阶阶段。在此背景下&#xff0c;为了进一步提高金融科技的管理水平&#xff0c;商业银行需要改变传统金融运维模式&#xff0c;对已有运维体…

Web漏洞-文件上传常见验证

后缀名&#xff1a;类型&#xff0c;文件头等 后缀名&#xff1a;黑白名单 文件类型&#xff1a;MIME信息 文件头&#xff1a;内容头信息 常见黑名单&#xff08;明确不允许上传的格式后缀&#xff09;&#xff1a;asp、php、jsp、aspx、cgi、war &#xff08;如果没有完整…

Retrofit2 完全解析 探索与okhttp之间的关系

//用于访问zhy的信息 http://192.168.1.102:8080/springmvc_users/user/zhy //用于访问lmj的信息 http://192.168.1.102:8080/springmvc_users/user/lmj 即通过不同的username访问不同用户的信息&#xff0c;返回数据为json字符串。 那么可以通过retrofit提供的PATH注解非…

Java文件流操作

一、文件创建和删除 public static void main(String[] args) throws IOException {File file new File("..\\hello-world.txt");//..表示在上机目录下创建hello-world.txtSystem.out.println(file.getPath());//返回当前相对路径System.out.println(file.getCanoni…

电商技术揭秘十二:电商平台的搜索引擎优化与营销小结

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

图像分割 - 利用K-means聚类方法实现图像分割

1、前言 传统的数字图像处理算法中,针对于图像分割部分,除了阈值处理、区域生长啊等等之类的,还有很经典的聚类算法 图像分割是指将图像划分为多个片段。这是因为对于不同的图像任务,我们往往不care整个图片,只对感兴趣的区域处理,这就是图像分割的意义。 聚类算法的思…

2024.4.6-day11-CSS 背景和精灵图

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业2024.4.6学习笔记1 背景2 背景图片3 CSS 精灵图 作业 <!DOCTYPE html&…

消息中间件之消息通信模型MQ

一&#xff0c;为什么需要MQ&#xff1f; 应用中&#xff0c;经常需要对庞大的海量数据进行监控&#xff0c;随着网络技术和软件开发技术的不断提高&#xff0c;在实战开发中MQ的使用与日俱增&#xff0c;特别是RabbitMQ在分布式系统中存储转发消息&#xff0c;可以保证数据不…

ezuikit.js播放链接三种方式

第一种&#xff1a;iframe嵌入的方式 适用于ezopen开头的链接格式 举例&#xff1a;ezopen://open.ys7.com/BB98332770/1.hd.live <iframeid"ysOpenDevice"src{https://open.ys7.com/ezopen/h5/iframe? url${item.url}&autoplay1&accessToken${item…

全网最详细的网络安全自学笔记

1.选择方向 首先是选择方向的问题&#xff0c;网络安全是一个很宽泛的专业&#xff0c;包含的方向特别多。比如 web安全&#xff0c;系统安全&#xff0c;无线安全&#xff0c;二进制安全&#xff0c;运维安全&#xff0c;渗透测试&#xff0c;软件安全&#xff0c;IOT安全&am…

揭秘月赚600万的团购新模式:零风险购物竟能带来丰厚收益?

你是否曾经被看似赔钱的买卖吸引&#xff0c;最后却发现其背后的巨大盈利潜力&#xff1f;这种震撼的体验&#xff0c;让我深感好奇与惊喜。今天&#xff0c;我将与你分享一个不同寻常的商业模式&#xff0c;它或许能启发你走上属于自己的盈利之路。 这家小程序商城以其独特的团…

编译原理实验3(基于算符优先文法分析的语法分析器 )

实验目的 加深对语法分析器工作过程的理解&#xff1b;加强对算符优先分析实现语法分析程序的掌握&#xff1b;能够产用一种编程语言实现简单的语法分析程序&#xff1b;能够使用自己编写的分析程序对简单的程序段进行语法分析。 实验要求 根据简单表达式文法构造算符优先分…

实景三维在文化旅游领域的应用

实景三维技术&#xff0c;作为一种前沿的科技手段&#xff0c;近年来在文化旅游领域的应用逐渐崭露头角。它能够将真实世界的场景以三维的形式精确呈现&#xff0c;为游客带来身临其境的体验&#xff0c;为文化旅游注入新的活力。本文将探讨实景三维在文化旅游领域的应用及其所…

算法汇总啊

一些常用算法汇总 算法思想-----数据结构动态规划(DP)0.题目特点1.【重点】经典例题(简单一维dp&#xff09;1.斐波那契数列2.矩形覆盖3.跳台阶4.变态跳台阶 2.我的日常练习汇总(DP)1.蓝桥真题-----路径 算法思想-----数据结构 数据结构的存储方式 : 顺序存储(数组) , 链式存储…

【一步一步学】新手如何学习RouterOS

最近有很多同学私下问&#xff1a;ROS太难学&#xff0c;很难入门。 我在这里统一回答大家这个问题&#xff0c;其实入门还是比较简单&#xff0c;今天我写一个大概的学习过程 &#xff0c;后续是需要你们自己针对性学习与深入研究。 1. 了解RouterOS基础 学习任何东西&#x…