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

news2024/11/21 1:25:21

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用于指定内存对齐方式

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker笔记(二):镜像、容器数据卷

四、 docker镜像 4.1 镜像 镜像是一种轻量级、可执行的独立软件包&#xff0c;用来打包软件运行环境和基于运行环境开发的软件&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;包括代码、库、环境变量和配置文件 所有的应用&#xff0c;直接打包docker镜像就可以直…

BPMNJS 在原生HTML中的引入与使用

BPMNJS 在HTML中的引入与使用 在网上看到的大多是基于vue使用BPMN的示例或者教程&#xff0c;竟然没有在HTML使用的示例&#xff0c;有也是很简单的介绍核心库的引入和使用&#xff0c;并没有涉及到扩展库。于是简单看了下&#xff0c;真的是一波三折&#xff0c;坎坎坷坷。不…

MobTech积极参与鸿蒙生态建设,HarmonyOS NEXT鸿蒙星河版产品即将发布

1月18日&#xff0c;在鸿蒙生态千帆启航仪式上&#xff0c;华为宣布HarmonyOS NEXT鸿蒙星河版开发者预览正式面向开发者开放申请。被称为“纯血鸿蒙”的鸿蒙星河版将实现原生精致、原生易用、原生流畅、原生安全、原生智能、原生互联6大极致原生体验。 作为深耕开发者服务领域…

二分法题集1

1 二分查找 分析&#xff1a; 这是一道很简单的二分法题&#xff0c;定义两个指针和中间值middle&#xff0c;判断middle对应数组值与目标值的大小关系&#xff0c;从而对left和right进行修改。由于太过基础&#xff0c;代码简单基础就不多赘述。 目录 1 二分查找 分析&…

Oracle 数据库维的建立

Oracle 数据库维的建立 SQL> select table_name from dict where table_name like %DBA%DIM%;TABLE_NAME ------------------------------ DBA_DIMENSIONS DBA_DIM_LEVELS DBA_DIM_LEVEL_KEY DBA_DIM_ATTRIBUTES DBA_DIM_HIERARCHIES DBA_DIM_CHILD_OF DBA_DIM_JOIN_KEYsel…

专题【链表】【考试题】刷题日记

题目列表 考试题&#xff08;22题&#xff09; 2024.04.04 146. LRU 缓存 707. 设计链表 138. 随机链表的复制 160. 相交链表 622. 设计循环队列 109. 有序链表转换二叉搜索树 460. LFU 缓存 355. 设计推特 725. 分隔链表 2487. 从链表中移除节点 日常复习题 876. 链表的中…

【智能算法应用】猎人猎物优化算法(HPO)在WSN覆盖中的应用

目录 1.算法原理2.数学模型3.结果展示4.参考文献 1.算法原理 【智能算法】猎人猎物算法&#xff08;HPO&#xff09;原理及实现 2.数学模型 3.结果展示 HPO设置区域边长为20&#xff0c;节点数为35&#xff0c;感知半径为2.5&#xff0c;实验结果如下&#xff1a; 4.参考…

iMazing 3 for Windows iOS设备管理软件2024最新功能解析

iMazing 3 for Windows是一款兼容Win和Mac的iOS设备管理软件。iMazing 3 for Windows能够将音乐、文件、消息和应用等数据从任何 iPhone、iPad 或 iPod 传输到 Mac 或 PC 上。 iMazing 3 win 版下载&#xff1a; https://souurl.cn/Qp6gFU iMazing 3 mac 版下载&#x…

一点点金融

一点点金融 价值投资 需求 > 有限 > 不可逆 > 优势 > 长期持有者多趋势分析 改进MACD策略&#xff0c;使用涨跌幅比值RSI计算MACD原始MACD计算改进思路&#xff1a;使用涨跌幅比值RSI计算MACD 价值投资 需求 > 有限 > 不可逆 > 优势 > 长期持有者多…

非关系型数据库——Redis基本操作

目录 一、Redis数据库常用命令 1.Set——存放数据 2.Get——获取数据 3.Keys——获取符合条件的键值 4.Exists——判断键值是否存在 5.Del——删除指定键值 6.Type——获取键值对应的类型 7.Rename——对已有键值重命名&#xff08;覆盖&#xff09; 8.Renamenx——对…

安全性基础知识

根据希赛相关视频课程汇总整理而成&#xff0c;个人笔记&#xff0c;仅供参考。本章核心为网络攻击和信息安全的实现技术 安全性基本概念 计算机安全原则&#xff1a; 在系统设计时&#xff0c;实现安全措施应具有简洁性&#xff1b; 系统的保护机制应该公开&#xff1b; 用户…

【Linux】使用cloudreve搭建个人网盘并传输文件

Cloudreve 是一个开源的个人网盘系统&#xff0c;能够帮助用户搭建属于自己的私有云存储服务。它支持多种存储后端&#xff0c;包括本地存储、远程FTP/SFTP存储、以及云存储服务如阿里云OSS、腾讯云COS和Amazon S3等。Cloudreve具有友好的用户界面和丰富的功能&#xff0c;比如…

Git相关的内容来这里看看吧

Git相关的内容来这里看看吧 1、Centos 安装Git方法一&#xff1a;yum命令安装(可能不是最新版本)方法二&#xff1a;源码安装Git配置以及如何配置密钥 Git常用命令参考链接 1、Centos 安装Git 方法一&#xff1a;yum命令安装(可能不是最新版本) yum install -y git卸载已安装…

虚拟机打不开

问题 另一个程序已锁定文件的一部分&#xff0c;进程无法访问 打不开磁盘“G:\centeros\hadoop104kl\hadoop100-cl2.vmdk”或它所依赖的某个快照磁盘。 模块“Disk”启动失败。 未能启动虚拟机。 原因 前一次非正常关闭虚拟机导致.lck 文件是VMWare软件的一种磁盘锁文件&…

计算机网络练习-计算机网络概述与性能指标

计算机网络概述 ----------------------------------------------------------------------------------------------------------------------------- 1. 计算机网络最据本的功能的是( )。 1,差错控制 Ⅱ.路由选择 Ⅲ,分布式处理 IV.传输控制 …

Tcl学习笔记(二)——表达式、字符串

目录 1. 表达式 算数操作符 关系操作符 逻辑操作符 按位操作符 选择操作符 数学函数 字符串操作 2. 字符串 字符串长度、大小写转换、裁剪、重复 字符串类型 字符的获取 字符串的添加、删除、替换 字符串的比较 字符串的简单搜索 字符串的匹配 格式化…

C语言中strlen函数的实现

C语言中strlen函数的实现 为了便于和strlen函数区别&#xff0c;以下命令为_strlen。 描述&#xff1a;实现strlen&#xff0c;获取字符串的长度&#xff0c;函数原型如下&#xff1a; size_t strlen(const char *str);_strlen实现&#xff1a; size_t _strlen(const char*…

开源流程图表库(04):mxGraph,都是可视化编辑,导出使用。

mxGraph是一个用于创建和展示图形的JavaScript库。它提供了丰富的功能和工具&#xff0c;可以用于构建各种类型的图形应用程序&#xff0c;包括流程图、组织结构图、网络拓扑图等。 mxGraph的编辑器 一、mxGraph的特点和功能 以下是一些mxGraph的特点和功能&#xff1a; 强大…

微信小程序的页面交互2

一、自定义属性 &#xff08;1&#xff09;定义&#xff1a; 微信小程序中的自定义属性实际上是由data-前缀加上一个自定义属性名组成。 &#xff08;2&#xff09;如何获取自定义属性的值&#xff1f; 用到target或currentTarget对象的dataset属性可以获取数据 &#xff…

dm8 备份与恢复

dm8 备份与恢复 基础环境 操作系统&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本&#xff1a;DM Database Server 64 V8 架构&#xff1a;单实例1 设置bak_path路径 --创建备份文件存放目录 su - dmdba mkdir -p /dm8/backup--修改dm.ini 文件…