当前位置: 首页 > news >正文

C语言基础(十)

编译预处理命令:

预编译命令在C语言中用于在编译前进行一些特定的处理和控制,帮助程序员更灵活地管理源代码和控制编译过程。

C语言常用的预编译命令:

#include:用于包含头文件,将另一个文件的内容插入到当前文件中。

#include 可以将头文件中的声明、定义等内容导入到当前源文件中,从而使得程序中可以使用头文件中定义的函数、变量等。
使用尖括号(< >)包含文件用于包含系统或全局范围的头文件,这些头文件通常存储在系统目录的标准库中。

使用双引号(" ")包含文件用于包含用户定义的头文件,这些头文件通常在当前项目的目录中或者特定的包含路径中。

......................................................................................................................................................... 

#define和#undef:用于定义和取消宏。 编译时,预处理器会将程序中出现的宏名替换为宏定义中的内容。

#ifdef、#ifndef、#else和#endif:用于条件编译,根据条件选择性地包含代码。

#ifdef 指令用于判断一个宏是否已经定义,如果定义了,则编译后面的代码段。

语法为:

#ifdef MACRO_NAME
    // Code to be compiled if MACRO_NAME is defined
#endif

#ifndef 和 #else 是 C 语言中的预处理指令,用于条件编译。通常与 #ifdef 一起使用,可以让程序根据宏的定义情况选择性地编译代码段。

#ifndef:#ifndef 指令和 #ifdef 相反,用于判断一个宏是否未定义,如果未定义,则编译下面的代码段。

语法为:

#ifndef MACRO_NAME
    // Code to be compiled if MACRO_NAME is not defined
#endif

当宏 MACRO_NAME 未被定义时,编译器会编译 #ifndef 到 #endif 之间的代码。

#else:#else 指令用于在 #ifdef 或 #ifndef 的条件不成立时执行备选代码段。

语法为:

#ifdef MACRO_NAME
    // Code to be compiled if MACRO_NAME is defined
#else
    // Code to be compiled if MACRO_NAME is not defined
#endif

如果 MACRO_NAME 宏已经定义,则编译 #ifdef 到 #else 之间的代码;否则编译 #else 到 #endif 之间的代码。
通过结合使用 #ifndef 和 #else 可以更灵活地根据宏的定义情况选择性地编译不同的代码段,实现条件编译的效果。

.......................................................................................................................................................... 

#pragma:用于向编译器发送特定的指令。

#error:用于生成编译错误信息。

#line:用于修改行号和文件名信息。

#if、#elif和#else:用条件编译,根据条件选择性地包含代码。

#warning:用于生成编译警告信息。

#pragma pack:用于在编译时设置内存对齐方式。通过 #pragma pack(n) 可以指定结构体、联合体或类的成员变量按照 n 字节对齐。该指令可以有效减小结构体大小,节省内存空间,但是对齐方式不当可能导致性能问题或者其他错误。通常在需要与外部系统或硬件进行数据交互时使用。

#pragma warning:用于控制编译警告的输出。

#LINE、FILE、DATE、__TIME__等预定义宏:用于获取编译时的行号、文件名、日期、时间等信息。

1、宏定义:

测试代码:

//无参数的宏定义:用一个标识符(宏名)来代表一个字符串(宏体)。
//在预处理阶段,预处理器会将所有的宏名替换为它们对应的宏体。
//格式:#define 宏名 替换文本//带参数的宏定义: 有参数的宏定义允许宏像函数一样接受参数,并在宏体内使用这些参数。
//格式:#define 宏名(参数列表) 替换文本 #define VERSION "1.2.3" // 定义了一个无参数的宏,用于表示软件版本号  
//有参宏定义,宏的每个参数在宏定义体内用圆括号将参数括起来,宏体也用圆括号括起来,避免因运算符优先级导致的错误。 
#define MAX(a, b) ((a) > (b) ? (a) : (b)) // 定义了一个带参数的宏,用于计算两个数中的最大值  
#include <stdio.h>  // 引入标准输入输出库  int main() {    // 打印软件版本号  printf("当前软件版本:%s\n", VERSION);  // 使用MAX宏计算两个数的最大值  int x = 5, y = 10;    int max_value = MAX(x, y);  printf("x和y中较大的数是:%d\n", max_value); // 在printf中使用MAX宏  printf("x和3的较大数是:%d\n", MAX(x, 3)); return 0;    
}

运行结果如下:

....................................................................................................................................................... 

2、条件编译:

 创建一个funtion.h头文件:

#ifndef Fun
#define Fun// 声明void类型的函数sayHello,无参数
void sayHello();// 声明void类型的函数subtraction,有两个int类型的参数a和b
void subtraction(int a, int b);// 声明int类型的函数adds,无参数
int adds();// 声明char类型的函数addition,有两个int类型的参数a和b
char addition( int a,int b);// 声明单词统计函数
void countAndPrintWords(char str[]); #endif

创建一个 implementfunction.h头文件:

#ifndef FunIm 
#define FunIm 
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>// 实现funtion.h中声明的函数// 定义sayHello函数
void sayHello() {printf("Hello, World!\n");
}// 定义subtraction函数
void subtraction(int a, int b) {int multiplication = a * b;printf("The sum of %d and %d is %d\n", a, b, multiplication);
}// 定义adds函数
int adds() {return 10 + 20;
}// 定义addition函数
char addition(int a, int b) {return (char)a + b;
}//定义单词统计函数
void countAndPrintWords(char *str) {bool inWord = false;int wordCount = 0;// 循环遍历字符while (*str) {// 如果当前字符是字母或数字,表示在单词中if (isalnum(*str)) {if (!inWord) {inWord = true;wordCount++;printf("Word %d: ", wordCount);}printf("%c", *str);} else {if (inWord) {inWord = false;printf("\n");}}// 移动到下一个字符str++;}if (inWord) {printf("\n");}printf("Total words: %d\n", wordCount);
}
#endif

在main()函数中调用:

#include "funtion.h"//自定义的头文件用"" 
#include "implementfunction.h"//自定义的头文件用"" int main() {sayHello();subtraction(99, 5);int c = adds();char result = addition(81,5);printf("result = %d\n", result);  // 输出结果 printf("%c\n", result);printf("%d\n", c);  // 输出整数值char str[] = "This directive can help reduce the size of a structure, saving memory space, ""is important to be cautious as improper alignment may lead to performance issues ""or external systems or hardware.";countAndPrintWords(str);return 0;}

运行结果如下:

相关文章:

C语言基础(十)

编译预处理命令&#xff1a; 预编译命令在C语言中用于在编译前进行一些特定的处理和控制&#xff0c;帮助程序员更灵活地管理源代码和控制编译过程。 C语言常用的预编译命令&#xff1a; #include&#xff1a;用于包含头文件&#xff0c;将另一个文件的内容插入到当前文件中…...

人像比对-人证比对-人脸身份证比对-人脸身份证实名认证-人脸三要素对比-实人认证

人脸身份证实名认证是一种基于生物识别技术的身份验证方式&#xff0c;主要依托证件OCR识别技术、活体检测、人脸比对等技术手段&#xff0c;对用户身份信息真实性进行核验&#xff0c;确保用户为真人且为本人。以下是关于人脸身份证实名认证的详细解析&#xff1a; 一、认证流…...

Android 上下滑隐藏显示状态栏

一、DisplayPolicy类中监听滑动事件&#xff0c;然后发送广播事件 Android12类路径&#xff1a; frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.javamSystemGestures new SystemGesturesPointerEventListener(mUiContext, mHandler,new SystemGest…...

USBCAN-II/II+使用方法以及qt操作介绍

一.USBCAN-II/II介绍 USBCAN-II/II 是一款常用的 USB-CAN 转换器&#xff0c;广泛应用于汽车电子、工业自动化等领域。以下是使用该设备的一般步骤和方法&#xff1a; 1. 硬件连接 连接设备&#xff1a;将 USBCAN-II/II 的 USB 接口连接到计算机的 USB 端口。 连接 CAN 网络…...

笔记-系统规划与管理师-案例题-2022年-IT服务部署实施

【说明】 某大型企业去年信息化投入大&#xff0c;完成了重点核心业务系统的建设。由于应急相应预案制定得不充分并且未开展演练&#xff0c;出现了系统性故障时&#xff0c;部分关键的应用系统不可用且在12小时内未能完成恢复业务&#xff0c;给企业带来了较大损失。 为加强该…...

Kubernetes 清理资源常用的 Kubernetes 清理命

清理特定状态的 Pod&#xff1a; 清理 Evicted 状态的 Pod&#xff1a; kubectl get pods --all-namespaces -o wide | grep Evicted | awk {print $1,$2} | xargs -L1 kubectl delete pod -n清理 Error 状态的 Pod&#xff1a; kubectl get pods --all-namespaces -o wide | g…...

【数据结构初阶】二叉树--基本概念

hello&#xff01; 目录 一、树 1.1 树的概念和结构 1.2 树的相关术语 1.3 树的表示 1.4 树形结构实际应用场景 二、二叉树 2.1 概念和结构 2.2 特殊的二叉树 2.2.1 满二叉树 2.2.2 完全二叉树 2.3 二叉树的存储结构 2.3.1 顺序结构 2.3.2 链式结构 …...

Pytorch添加自定义算子之(12)-开闭原则设计tensorrt和onnxruntime推理语义分割模型

一、开闭原则 开闭原则是SOLID原则中的一个,指的是尽量使用开放扩展,关闭修改的设计原则。 在C++中如何使用开闭原则导出动态库,可以按照以下步骤进行: 定义抽象基类:定义动态库中的抽象基类,该基类应该封装可扩展的接口。 实现派生类:实现基类的派生类,这些派生类将封…...

第二百零九节 Java格式 - Java数字格式类

Java格式 - Java数字格式类 以下两个类可用于格式化和解析数字: java.text.NumberFormatjava.text.DecimalFormat NumberFormat 类可以格式化一个数字特定地区的预定义格式。 DecimalFormat 类可以格式化数字以特定区域设置的自定义格式。 NumberFormat类的 getXXXInstance…...

LSI-9361阵列卡笔记

背景 要将raid0更改为JBOD直通模式 注意的点是要先将raid模式调整为JBOD之后重启机器&#xff0c;即可 备注&#xff1a;转换过程中硬盘中的数据未丢失。 步骤贴图 refer https://zhiliao.h3c.com/questions/dispcont/123250 https://blog.csdn.net/GreapFruit_J/article/…...

ArcGIS热点分析 (Getis-Ord Gi*)——基于地级市尺度的七普人口普查数据的热点与冷点分析

先了解什么是热点分析 ? 热点分析 (Getis-Ord Gi*) 是一种用于空间数据分析的技术&#xff0c;主要用于识别地理空间数据中值的聚集模式&#xff0c;可以帮助我们理解哪些区域存在高值或低值的聚集&#xff0c;这些聚集通常被称为“热点”或“冷点”&#xff0c;Gi* 统计量为…...

ASIACRYPT 2021

分类文章编号获奖论文1-3后量子密码4-9多方计算10-15物理攻击,泄露和对策16-21理论22-27公钥密码和鉴权密钥交换28-33高级加密和签名34-39对称密钥构建40-46量子安全47-53获奖论文54对称密码分析55-66增强型公钥加密和时间锁难题67-72同态加密和加密搜索73-77NIZK和SNARK78-80…...

C#学习之路day1

目录 一、概念&#xff1a;.net和c# 二、.net发展方向 三、.Net两种交互模式 四、创建项目 五、vs的组成部分 六、我的第一个C#程序 七、多个项目时启动项目的设置 八、注释 九、快捷键 一、概念&#xff1a;.net和c# 1、.net/dotnet :一般指.Net Framework框架&#…...

【安当产品应用案例100集】010-基于国密UKEY的信封加密应用案例

安当有个客户开发了一套C/S架构的软件&#xff0c;Server在云端&#xff0c;Client由不同的用户使用。最初软件设计开发的时候&#xff0c;没有考虑数据安全形势日渐严峻的问题&#xff0c;Server端和Client端直接就建立一个socket连接来进行通信&#xff0c;Server端发出去的数…...

扫码点餐系统小程序功能分析

扫码点餐系统小程序通常具备以下核心功能&#xff1a; 用户界面&#xff1a;提供直观易用的界面&#xff0c;方便用户浏览菜单、选择菜品、查看订单状态等 。菜单展示&#xff1a;展示餐厅的菜单&#xff0c;包括菜品图片、价格、描述等信息 。扫码点餐&#xff1a;用户通过…...

网络安全——基础知识记忆梳理

1. SQL注入攻击 SQL注入攻击是一种常见的网络安全威胁&#xff0c;它利用Web应用程序中对用户输入的数据的不正确处理&#xff0c;攻击者可以在SQL查询中注入恶意代码&#xff0c;从而执行非授权的数据库操作。这种攻击方式可以导致数据泄漏、数据篡改、绕过认证等多种安全问题…...

GitHub开源的轻量级文件服务器,可docker一键部署

文件服务器 介绍安装使用命令使用API调用 介绍 项目github官网地址 Dufs是一款由Rust编写的轻量级文件服务器&#xff0c;不仅支持静态文件服务&#xff0c;还能轻松上传、下载、搜索文件&#xff0c;甚至支持WebDAV&#xff0c;让我们通过Web方式远程管理文件变得轻而易举。…...

Scratch编程深度探索:解锁递归与分治算法的奥秘

标题&#xff1a;Scratch编程深度探索&#xff1a;解锁递归与分治算法的奥秘 在编程的世界里&#xff0c;递归和分治算法以其精妙的逻辑结构和解决问题的能力而著称。Scratch&#xff0c;这款专为儿童和初学者设计的图形化编程工具&#xff0c;是否能够支持实现这样复杂的逻辑…...

使用docker compose一键部署 Portainer

使用docker compose一键部署 Portainer Portainer 是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便地管理Docker环境&#xff0c;包括单机环境和集群环境。 1、创建安装目录 mkdir /data/partainer/ -p && cd /data/partainer2、创建docker…...

js原生模板引擎

在JavaScript中,可以使用模板字符串(template strings)来创建简单的模板。模板字符串是用反引号(`)标识的字符串,其中内嵌表达式使用${}格式。 下面是一个简单的模板函数示例,它接受一个对象作为参数,并使用模板字符串来生成一个HTML字符串。 function createTemplat…...

Nigate:让Mac与Windows硬盘和谐共处的开源桥梁

Nigate&#xff1a;让Mac与Windows硬盘和谐共处的开源桥梁 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management for NTFS …...

OpenFOAM实战:在interFoam中植入多孔介质源项模拟复杂固壁

1. 多孔介质模拟的工程需求与原理 在流体力学仿真中&#xff0c;我们经常遇到需要处理复杂几何边界的情况。传统方法是通过精细的网格划分来精确描述固体边界&#xff0c;但这会带来两个主要问题&#xff1a;一是计算成本急剧上升&#xff0c;二是对于动态变化的边界&#xff0…...

3个核心机制解密:如何让视频PPT提取工具智能识别每一页幻灯片

3个核心机制解密&#xff1a;如何让视频PPT提取工具智能识别每一页幻灯片 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 你是否曾经面对长达数小时的会议录像&#xff0c;需要从中提…...

【博安通BW16模组专题②】实战TCP客户端:从指令到云端数据透传

1. 认识BW16模组的TCP客户端功能 博安通BW16模组作为一款高性价比的物联网通信模块&#xff0c;其TCP客户端功能在实际项目中应用广泛。简单来说&#xff0c;TCP客户端就是能够主动连接服务器的终端设备&#xff0c;比如我们常见的智能家居设备连接云端服务器&#xff0c;就是典…...

虞城装修公司选哪家专业?业主正确对比装修公司的方法,看完不踩坑

在虞城准备装修的业主&#xff0c;大多都会纠结一个问题&#xff1a;虞城装修公司这么多&#xff0c;到底哪家更专业&#xff1f; 很多人都是第一次装修&#xff0c;不懂行、不会分辨&#xff0c;只会看价格、看广告&#xff0c;很容易被低价套路、中途增项、工艺偷工减料坑到崩…...

智能任务调度引擎:重构碧蓝航线自动化管理架构

智能任务调度引擎&#xff1a;重构碧蓝航线自动化管理架构 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 在移动游戏生命周…...

终极指南:快速掌握碧蓝航线Live2D资源提取技术

终极指南&#xff1a;快速掌握碧蓝航线Live2D资源提取技术 【免费下载链接】AzurLaneLive2DExtract OBSOLETE - see readme / 碧蓝航线Live2D提取 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneLive2DExtract 在数字内容创作和游戏开发领域&#xff0c;Live2D动…...

内容可寻址存储器(CAM)原理与创新设计解析

1. 内容可寻址存储器基础解析在传统计算机架构中&#xff0c;我们通常使用随机存取存储器&#xff08;RAM&#xff09;通过地址来访问数据。但有一种特殊的存储结构打破了这种范式——内容可寻址存储器&#xff08;Content-Addressable Memory, CAM&#xff09;。它的独特之处在…...

2026-05-11 全国各地响应最快的 BT Tracker 服务器(联通版)

数据来源&#xff1a;https://bt.me88.top 序号Tracker 服务器地域网络响应(毫秒)1udp://60.172.236.18:6969/announce安徽芜湖联通102udp://118.196.100.63:6969/announce安徽芜湖联通113http://211.75.205.187:6969/announce安徽芜湖联通384http://211.75.205.188:80/announ…...

360安全浏览器-很恶心,经常自己绑定安装,有没有什么方法可以阻止安装?

360安全浏览器-很恶心,经常自己绑定安装,有没有什么方法可以阻止安装? 可以阻止360安全浏览器的自动安装‌,主要通过关闭其推荐功能、彻底卸载关联组件、禁用后台服务及使用系统策略拦截来实现。 一、关闭360软件的推荐安装设置 若已安装360安全卫士或360极速浏览器,需先…...