宏定义———C语言

*符号代表全部的意思*.i代表的是全部的点i文件

宏定义 :

1.定义:

  • #define   宏名+ 常量
  • 功能:宏名代替常量,宏名要求全大写且见名知义

 2.示例:

#include <stdio.h>
#define PI 3.14
#define Q 4
#define P Q+Qint main(){float r =0;printf("input r:");scanf("%f",&r);float area = PI*r*r;printf("area = %.2f\n",area);//3.14*2*2printf("P*P=%d",P*P);//4+4*4+4=24原样替换return 0;
}

fbac511079714154ab4552a499084d9a.png

  • 编译器会将宏原样替换:
  • gcc -E define——01.c -o define_01.i(预处理时进行原样替换)
    vi define_01.i

3.宏函数

语法:#define Clii(x)  (x*x)#define 宏函数名(参数1,参数2)表达式

#include <stdio.h>
#define M 10
#define CALC(x)   (x * x)//防止原样替换
int main(){printf("M = %d\n",M);printf("Result = %d\n", CALC(M + M));return 0;
}

4.嵌入式开发常用宏操作 do...while(0)

定义宏函数:

#include <stdio.h>
void print_demo1(){printf("demo first\n");
}
void print_demo2(){printf("demo second\n");
}
void print_demo3(){printf("demo second\n");
}
#define   TEST()     print_demo1();print_demo2(); print_demo3();
int main(){TEST(); //单独使用无任何副作用;return 0;
}

在添加使用:各种逻辑语句时容易出现问题

嵌入式常用:do{x*x;}while(0)执行一次(使用过后没有数值的返回),若想多行需要加/进行拼接

05a4e4a243d0489ca9d9e2a7b6439736.png

if   else使用时将{ }加上

e852733d4f894222a638f1fc8b551c05.png

当使用多条函数调用时:加大括号或使用do while语句do while 不会提供返回值只会执行函数

5.字符串化运算符#

将传入的值转化为字符串

eg:x = 4+2 #define CALC(x)printf(#x"=%d\n",x)

#include <stdio.h>
#define CALA(m) printf(#m"=%d\n",m);
#define N 10
#define SS(N) printf(#N);//不需要""即可将数字或其他的转化为字符串
int main(){CALA(3+4);SS(N);return 0;
}

 6bcfba0957be40209c626a650ed348ec.png

6.不定参数宏

_VA_ARGS_:表示可变参数列表,传入的参数都放置于_VA_ARGS_中

#include <stdio.h>
#define LOG(...)    printf(__VA_ARGS__)
#define LOGSTR(fm,...)  printf(fm,__VA_ARGS__);
int main(){LOG("This Time is %d o'clock\n",12);LOG("This Time is %d:%d:%d\n",11,9,23);LOGSTR("data = %d%s\n",100,"RMB");return 0;
}

 

7ff00c9b278d4b10b9d69d4dfe2341fd.png

条件编译

1.命令行参数:

int main(int argc,char*argv[]) 计算命令行输入值的个数argc 参数的个数 argv 参数内容(都是以字符串的形式出现)

#include <stdio.h>int main(int argc,const char* args[]){printf("argc=%d\n",argc);printf("args[0]=%s\n",args[0]);printf("args[1]=%s\n",args[1]);return 0;
}

03d9185ea12749efb842ab3d91ac4d60.png

2.新代码注释(条件编译)

 #if 宏名

  代码块

#endif

宏名为真,则编译代码

 #if 宏名

   代码块1

#else

   代码块2

#endif

如果宏名为真,则编译代码块1,否则编译代码块2

  • 生产环境:不建议完全关闭日志,至少保留错误日志并定期轮转。可以考虑优化日志的存储方式和级别。
  • 开发环境:应该打开详细的日志输出,以帮助排查问题。合理配置日志级别,避免开发过程中不输出日志而导致问题难以定位。

 多文件编程

 

1.extern关键字

功能:声明变量或函数是来源于其它文件的全局变量或全局函数

 eg:

#include <stdio.h>
extern int global_variable;//extern大多用于头文件
extern void show();
int main(){printf("global_variable=%d\n",global_variable);show();return 0;
}

2.多文件编程框架

1. 头文件 xxx.h

3fb2db93d3f44c738514c84e31e0a78e.png

2. 功能文件 :

xxx.c主要存放用户编写的逻辑代码函数,不包括main函数

3. 组合逻辑的文件 :

main.c用于组合功能文件提供的函数接口

3.添加#ifndef的必要性

  • #ifndef HEADER_NAME_H
  • #define HEADER_NAME_H
  • // 头文件内容,如函数声明、宏定义、结构体声明等
  • #endif // HEADER_NAME_H

感谢诸君将我的文章看完,希望我的文章能对各位有所帮助 

 0c68a8b8227f4bdcb776b848e10e4597.png

 

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

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

相关文章

虚幻5|给武器添加碰撞检测与伤害

本章内容衔接上两章&#xff0c;需要完成上两章才能用本章内容 虚幻5|角色武器装备的数据库学习&#xff08;不只是用来装备武器&#xff0c;甚至是角色切换也很可能用到&#xff09;-CSDN博客虚幻5|普通攻击&#xff0c;使用接口更方便-CSDN博客 如有疑问&#xff0c;可访问…

利用EditPlus进行Json数据格式化

利用EditPlus进行Json数据格式化 git下载地址&#xff1a;https://github.com/michael-deve/CommonData-EditPlusTools.git (安装过editplus的直接将里面的json.js文件复制走就行) 命令&#xff1a;Cscript.exe /nologo “D:\Program Files (x86)\EditPlus 3\json.js” D:\P…

简单的敏感词提示功能

简单的敏感词提示功能 1. 需求 公司现在接到通知&#xff0c;部分接口的部分手动输入字段&#xff0c;需要新增敏感词报红提示&#xff0c;敏感词汇现在应该是7000多个左右&#xff0c;需要我们提供一个敏感词校验接口&#xff0c;如果前端输入敏感词&#xff0c;则前端提示出…

【网络】UDP回显服务器和客户端的构造,以及连接流程

文章目录 回显服务器&#xff08;Echo Server&#xff09;0. 构造方法1. 接收请求2. 根据请求计算响应3. 将响应写回客户端4. 完整代码 客户端&#xff08;Echo Client&#xff09;0. 构造方法1. 读取输入2. 构造一个 UDP 请求3. 从服务器读取响应4. 完整代码 服务器与客户端连…

【自动化测试】技术交流论坛

前言 本篇使用Selenium3Junit5对个人技术交流论坛进行简单的自动化测试&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言1. 项目基础描述2. 编写手工测试用例3. 测试用例转自动化测试用例3.1 前置准…

NVR方案背景与产品介绍与构建一套完整的NVR产品解决方案

一、NVR和DVR 在视频监控领域&#xff0c;DVR和NVR是两种常用的录像技术。它们在系统结构、视频处理、存储和访问方式等方面存在明显的区别。&#xff0c;但都在视频监控中扮演着重要的角色。首先来了解它们的区别和特点&#xff0c;这有助于在选择合适的设备时做出明智的决策…

C语言第20天笔记

文件操作 概述 什么是 文件 文件时保存在外存储器上&#xff08;一般代指磁盘&#xff0c;也可以是U盘、移动硬盘等&#xff09;的数据的集合。 文件操作体现在哪几个方面 1. 文件内容的读取 2. 文件内容的写入 数据的读取和写入可被视为针对文件进行输入和输出的操作&a…

pytorch实现单层线性回归模型

文章目录 简述代码重构要点 数学模型、运行结果数据构建与分批模型封装运行测试 简述 python使用 数值微分法 求梯度&#xff0c;实现单层线性回归-CSDN博客 python使用 计算图&#xff08;forward与backward&#xff09; 求梯度&#xff0c;实现单层线性回归-CSDN博客 数值微分…

24/8/17算法笔记 策略梯度reinforce算法

import gym from matplotlib import pyplot as plt %matplotlib inline#创建环境 env gym.make(CartPole-v0) env.reset()#打印游戏 def show():plt.imshow(env.render(mode rgb_array))plt.show() show()定义网络模型 import torch #定义模型 model torch.nn.Sequential(t…

希亦、洁盟、苏泊尔眼镜清洗机哪款好用?热门眼镜清洗机测评总结

随着科学技术的发展&#xff0c;电子设备的升级&#xff0c;越来越多的人开始戴眼镜&#xff0c;而眼镜由于长时间的佩戴&#xff0c;镜框以及镜面都积累了一些灰尘以及人们肉眼所看不见的细菌&#xff0c;但是如果你使用普通的清洁方式去清洗的话肯定是清洗不干净的&#xff0…

【protobuf】ProtoBuf——proto3语法详解、字段规则、消息类型的定义与使用、通讯录的写入和读取功能实现

文章目录 ProtoBuf5. proto3语法详解5.1 字段规则5.2 消息类型的定义与使用 ProtoBuf 5. proto3语法详解 在语法详解部分&#xff0c;依旧通过项目推进的方式开展教学。此部分会对通讯录多次升级&#xff0c;用 2.x 表示升级的版本&#xff0c;最终将完成以下内容的升级&#x…

海康VisionMaster使用学习笔记4-快速匹配模块

快速匹配模块 快速匹配包括基本参数,特征模板,运行参数,结果显示 基本参数 可以修改图像源和模块的ROI区域. 特征模版 可以配置管理所有的模版,点击创建可以新增模版,也可以通过载入加载本地的模型 建立新模版 点击创建,可以选择当前图像或本地图像进行建模 模版存图按…

使用docker compose一键部署 Portainer

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

uni-app 使用九宫格(uni-grid)布局组件

1、运行环境 开发工具为 HBuilder X 4.23, 操作系统为 Windows 11。Vue.js 版本为 3. 2、操作步骤 首先&#xff0c;登录 HBuilder X。然后用桌面浏览器&#xff0c;访问官网组件网址。 https://ext.dcloud.net.cn/plugin?nameuni-grid 在组件网址右上角、点击“下载插…

每日一题-贪心算法

122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 55. 跳跃游戏 - 力扣&#xff08;LeetCode&#xff09; 这个题目一开始肯定是会懵&#xff0c;就比如说一开始先跳几步&#xff0c;之后再怎么跳&#xff0c;其实我们就可以用最大范围来算就行了&#xff0…

开发笔记:uniapp+vue+微信小程序 picker +后端 省市区三级联动

写在前面 未采用: 前端放置js 或者 json文件进行 省市区三级联动 采用&#xff1a; 前端组件 后端接口实现三级联动 原因&#xff1a;首先微信小程序有大小限制&#xff0c;能省则省&#xff0c;其次&#xff1a;方便后台维护省市区数据&#xff0c;完整省市区每年更新好像…

SQL基础教程(八)SQL高级处理

※食用指南&#xff1a;文章内容为《SQL基础教程》系列学习笔记&#xff0c;该书对新手入门非常友好&#xff0c;循序渐进&#xff0c;浅显易懂&#xff0c;本人主要用来补全学习MySQL中未涉及的部分&#xff0c;便于刷题和做项目。 官方电子书&#xff1a;《SQL基础教程》第2…

Web安全:SqlMap工具

一、简介 sqlmap 是一款开源的渗透测试工具&#xff0c;可以自动化进行SQL注入的检测、利用&#xff0c;并能接管数据库服务器。它具有功能强大的检测引擎,为渗透测试人员提供了许多专业的功能并且可以进行组合&#xff0c;其中包括数据库指纹识别、数据读取和访问底层文件系统…

柔性超级电容器咋储能?生物聚合物在其中起啥作用?有啥挑战?

*本文只作阅读笔记分享* 一、引言 随着对化石燃料影响的日益关注&#xff0c;开发用于先进电化学能量存储设备的绿色和可再生材料变得至关重要。超级电容器因其出色的寿命、安全性和宽温度操作范围等优势而成为有前途的储能候选者。柔性超级电容器特别适合为轻质可穿戴电子设…

我常用的几个傻瓜式爬虫工具,收藏!

爬虫类工具主要两种&#xff0c;一种是编程语言第三方库&#xff0c;比如Python的scrapy、selenium等&#xff0c;需要有一定的代码基础&#xff0c;一种是图形化的web或桌面应用&#xff0c;比如Web Scraper、后羿采集器、八爪鱼采集器、WebHarvy等&#xff0c;接近于傻瓜式操…