C语言--#运算符和##运算符

#运算符和##运算符

这里提前补充一点printf

C语言里面会天然的吧printf里面俩字符串合并为一个

#的使用

在C语言中,`#`符号主要用于预处理器指令。预处理器是在代码编译之前执行的,它处理所有以`#`开始的指令。以下是一些常见的使用情况:
1. **包含头文件**:

使用`#include`指令来包含其他头文件。

   ```c
   #include <stdio.h>
   #include "myheader.h"
   ```


2. **定义宏**:

使用`#define`指令来定义宏,这可以在程序中替换为其他文本。

   ```c
   #define PI 3.14159
   printf("The value of PI is: %f\n", PI);
   ```


3. **条件编译**:

使用`#ifdef`、`#ifndef`、`#if`、`#else`、`#elif`、`#endif`等指令来进行条件编译。

   ```c
   #ifdef DEBUG
   printf("Debugging information\n");
   #endif
   ```


4. **行号控制**

:使用`#line`指令来改变编译器输出的行号。
 

  ```c
   #line 100 "newfilename.c"
   // 这行代码的行号将被报告为100,且来源文件被报告为newfilename.c
   ```


5. **文件包含 guard**:

使用`#ifndef`和`#define`来防止头文件被多次包含。

   ```c
   #ifndef MY_HEADER_H
   #define MY_HEADER_H
   // 头文件内容
   #endif // MY_HEADER_H
   ```


6. **整型大小指定**:

在C99标准之前,使用`#`后跟整数来指定整型的大小。

   ```c
   #define SHORT int
   #define LONG long
   ```


7. **编译器指令**:

使用`#`来给编译器提供额外的指令,如`#pragma`。

   ```c
   #pragma once
   ```

请注意,C语言的预处理器不执行任何编程逻辑,它只是简单地替换预处理器指令中的文本。预处理器指令必须在源代码文件中以`//`或`/* */`注释掉之前执行。

具体举例

这里需要知道的是,“format”负责接收类型,这里用双引号,表示占位

也就是,如果你打印的是整数,这里双引号,输入你定义的类型,则此时后面打印的函数会变成你所定义的类型

所以我们可以做到,定义一个宏之后,我们可以使用多个模版进行套用,减少代码的冗余性。

这里我想不只是n,那我用#+变量

# 在宏定义中是一个操作符,用于连接字符串和宏参数。它并不是双引号的一部分。双引号用于定义宏中的字符串字面量,如 "数值的计算"

结果是一样的,但是字符发生了变化

#n 是在宏定义中使用双引号包围的字符串字面量的一部分,它会在宏展开时被替换为 n 的值。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define M(n,format) printf("数值的计算"#n ":is="format"\n",n)
int  main()
{
	int a = 1;
	M(a, "%d"); 


	long long b = 10;
	M(b, "%d"); 


	double c = 0.1;
	M(c, "%lf"); 


	return 0;
}


#define M(n,format) printf("数值的计算"#n ":is="format"\n",n)

这个宏 `M` 定义了一个带两个参数的宏:`n` 和 `format`。当这个宏被调用时,它会展开为以下代码:

printf("数值的计算"#n ":is="format"\n",n)

其中 `#n` 会被替换为 `n` 的实际值,`format` 会被替换为实际的格式字符串。例如,如果 `M(a, "%d")` 被调用,
那么它会展开为:printf("数值的计算1:is=%d\n",a)

这里的 `"数值的计算1:is=%d\n"` 是一个字符串字面量,其中 `%d` 是一个格式占位符,用于在运行时由 `a` 的值替换。

 所以这里我们得到的答案也就是我们预期的答案

##运算符 

可以把位于两端的符号合成一个符号 这里就是链接max,

简单说就是我们可以定义类型,如果type传过来的是int类型,那么我们就可以把所有的type换成int,此时会发发现,这个宏有了类型之分。但是我们计算的变量的名字我们希望是独一无二的,此时我们可以用##链接类型,也就是变成了

type type__max(int x,int y);这个就变成了宏的定义

可以进行一个两个数值的比较大小,并且只需要进行定义一个类型就哭哭完成相应的计算。

怎么使用的 就等于

我们在gcc里面进行观察 

 批量创造相似的函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

#define COMPUTE(type) \
type type##_COMPUTE(type x,type y)\
{\
return x>y?x:y;\
}

//函数的定义
COMPUTE(int);//int_COMPUTE
COMPUTE(float);//float_COMPUTE

int main()
{
    int ret1 = int_COMPUTE(3, 5);
    printf("%d\n", ret1);
    float ret2 = float_COMPUTE(3.1f, 4.5f);
    printf("%f\n", ret2);

	return 0;
}

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

命名约定

⼀般来讲函数的宏的使⽤语法很相似。所以语⾔本⾝没法帮我们区分⼆者。

那我们平时的⼀个习惯是:

把宏名全部⼤写

函数名不要全部⼤写

#undef

这条指令⽤于移除⼀个宏定义。

#undef NAME

//如果现存的⼀个名字需要被重新定义,那么它的旧名字⾸先要被移除。

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

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

相关文章

自定义校验器

1.前端校验 <template><el-dialog:title"!dataForm.brandId ? 新增 : 修改":close-on-click-modal"false":visible.sync"visible"><el-form:model"dataForm":rules"dataRule"ref"dataForm"keyu…

MySQL-主从复制:概述、原理、同步数据一致性问题、搭建流程

主从复制 1. 主从复制概述 1.1 如何提升数据库并发能力 一般应用对数据库而言都是“读多写少”&#xff0c;也就说对数据库读取数据的压力比较大&#xff0c;有一个思路就是采用数据库集群的方案&#xff0c;做主从架构、进行读写分离&#xff0c;这样同样可以提升数据库的并…

基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作

第一章、理论篇&#xff1a;以问题导入的方式&#xff0c;深入掌握原理基础 什么是MaxEnt模型&#xff1f; MaxEnt模型的原理是什么&#xff1f;有哪些用途&#xff1f; MaxEnt运行需要哪些输入文件&#xff1f;注意那些事项&#xff1f; 融合R语言的MaxEnt模型的优势&…

从0到1搭建文档库——sphinx + git + read the docs

sphinx git read the docs 目录 一、sphinx 1 sphinx的安装 2 本地构建文件框架 1&#xff09;创建基本框架&#xff08;生成index.rst &#xff1b;conf.py&#xff09; conf.py默认内容 index.rst默认内容 2&#xff09;生成页面&#xff08;Windows系统下&#xf…

大厂高频面试题复习JAVA学习笔记-JUC多线程及高并发(上)

目录 0 JUC基础概念 wait/sleep的区别 并发与并行的区别 线程的六个状态 JUC结构 ​编辑 1 请谈谈你对volatile的理解 JMM&#xff08;java内存模型&#xff09; 可见性 不保证原子性 有序性​编辑 指令重排 哪些地方用到volatile&#xff1a; 双端检查机制DLC …

PaddleVideo:PP-TSM视频分类

本文记录&#xff1a;使用Paddle框架训练TSM&#xff08;Temporal Shift Module&#xff09; 前提条件&#xff1a;已经安装Paddle和PadleVideo&#xff0c;具体可参考前一篇文章。 1-数据准备&#xff1a; 以UCF101为例&#xff1a;内含13320 个短视频&#xff0c;视频类别&…

数据库相关知识总结

一、数据库三级模式 三个抽象层次&#xff1a; 1. 视图层&#xff1a;最高层次的抽象&#xff0c;描述整个数据库的某个部分的数据 2. 逻辑层&#xff1a;描述数据库中存储的数据以及这些数据存在的关联 3. 物理层&#xff1a;最低层次的抽象&#xff0c;描述数据在存储器中时如…

Prometheus-Grafana基础篇安装绘图

首先Prometheus安装 1、下载 https://prometheus.io/download/ 官网路径可以去这儿下载 2、如图&#xff1a; 3.解压&#xff1a; tar -xf prometheus-2.6.1.linux-amd64 cd prometheus-2.6.1.linux-amd64 4.配置文件说明&#xff1a; vim prometheus.yml 5.启动Promethe…

基于 Vue3 + Webpack5 + Element Plus Table 二次构建表格组件

基于 Vue3 Webpack5 Element Plus Table 二次构建表格组件 文章目录 基于 Vue3 Webpack5 Element Plus Table 二次构建表格组件一、组件特点二、安装三、快速启动四、单元格渲染配置说明五、源码下载地址 基于 Vue3 Webpack5 Element Plus Table 二次构建表格组件&#x…

c++的学习之路:15、list(2)

本章主要是讲模拟实现list&#xff0c;文章末附上代码。 目录 一、创建思路 二、构造函数 三、迭代器 四、增删 五、代码 一、创建思路 如下方代码&#xff0c;链表是由一块一块不连续的空间组成的&#xff0c;所以这里写了三个模板&#xff0c;一个是节点&#xff0c;一…

书生浦语训练营二期第三次作业

文章目录 基础作业1. 在茴香豆 Web 版中创建自己领域的知识问答助手第一轮对话第二轮对话第三轮对话第四轮对话第五轮对话 2.在 InternLM Studio 上部署茴香豆技术助手修改配置文件创建知识库运行茴香豆知识助手 基础作业 1. 在茴香豆 Web 版中创建自己领域的知识问答助手 我…

2-django、http、web框架、django及django请求生命周期、路由控制、视图层

1 http 2 web框架 3 django 3.1 django请求生命周期 4 路由控制 5 视图层 1 http #1 http 是什么 #2 http特点 #3 请求协议详情-请求首行---》请求方式&#xff0c;请求地址&#xff0c;请求协议版本-请求头---》key:value形式-referer&#xff1a;上一次访问的地址-user-agen…

Vue3与TypeScript中动态加载图片资源的解决之道

在前端开发中&#xff0c;Vue.js已成为一个备受欢迎的框架&#xff0c;尤其是在构建单页面应用时。Vue3的发布更是带来了许多性能优化和新特性&#xff0c;而TypeScript的加入则进一步提升了代码的可维护性和健壮性。然而&#xff0c;在实际的项目开发中&#xff0c;我们有时会…

校园圈子小程序,大学校园圈子,三段交付,源码交付,支持二开

介绍 在当今的数字化时代&#xff0c;校园社交媒体和在线论坛成为了学生交流思想、讨论问题以及分享信息的常用平台。特别是微信小程序&#xff0c;因其便捷性、用户基数庞大等特点&#xff0c;已逐渐成为构建校园社区不可或缺的一部分。以下是基于现有资料的校园小程序帖子发…

Redis中的Sentinel(六)

Sentinel 选举领头Sentinel. 当一个主服务器被判断为客观下线时&#xff0c;监视这个下线主服务器的各个Sentinel会进行协商&#xff0c;选举出一个领头Sentinel,并由领头 Sentinel对下线主服务器执行故障转移操作。以下是Redis选举领头Sentinel的规则和方法: 1.所有在线的S…

Python | Leetcode Python题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:nums.sort()n len(nums)best 10**7# 根据差值的绝对值来更新答案def update(cur):nonlocal bestif abs(cur - target) < abs(best - target):best…

基于Arduino nano配置银燕电调

1 目的 配置电调&#xff0c;设置电机转动方向&#xff0c;使得CW电机朝顺时针方向转动&#xff0c;CCW电机朝逆时针转动。 2 步骤 硬件 Arduino nano板子及USB线变阻器银燕电调EMAX Bullet 20A朗宇电机 2205 2300KV格氏电池3S杜邦线若干接线端子 软件 BLHeliSuite 注意…

【论文速读】| 大语言模型平台安全:将系统评估框架应用于OpenAI的ChatGPT插件

本次分享论文为&#xff1a;LLM Platform Security: Applying a Systematic Evaluation Framework to OpenAI’s ChatGPT Plugins 基本信息 原文作者&#xff1a;Umar Iqbal, Tadayoshi Kohno, Franziska Roesner 作者单位&#xff1a;华盛顿大学圣路易斯分校&#xff0c;华盛…

服务器主机安全受到危害的严重性

为了让小伙伴们了解到服务器主机安全受到危害的严重性&#xff0c;以下详细说明一下&#xff1a;1. 数据泄露&#xff1a;如果服务器主机遭受攻击&#xff0c;攻击者可能会窃取敏感数据&#xff0c;如用户数据、商业秘密、机密文件等&#xff0c;导致数据泄露和商业机密的泄漏。…

51单片机之串口通信

目录 1.串口简介 1.1TXD和RXD 1.2通讯接口 1.3通信方式 1.4 51单片机的UART模式 2.串口配置 2.1寄存器简介 SCON寄存器配置 PCON配置 2.2代码配置串口 2.2.1 配置串口发送数据 2.2.2配置电脑向单片机发送数据点亮LED 1.串口简介 串口是一个应用十分广泛的通讯接口&am…
最新文章