C语言收尾 预处理相关知识

一. 预处理详解

1.1 预定义符号

FILE //进行编译的源文件
LINE //文件当前的行号
DATE //文件被编译的日期
TIME //文件被编译的时间
FUNCTION //文件当前所在的函数
STDC //如果编译器遵循ANSI C标准,其值为1,否则未定义

这些预定义符号都是语言内置的

我们来使用下上面的语句

 这样我们就可以知道 函数在什么时间 什么地点 发生了什么

1.2 #define 定义标识符号

define可以定义符号
例如

#define MAX 1000
int main()
{int m = MAX;//int m = 1000;printf("%d\n", m);return 0;
}

在预处理时其实MAX就变成了1000

这里注意的是define是不能加分号的 否则替换到源文件里面会出现各种问题

1.3 #define 定义宏

我们举个例子

#define SQUARE(x) (x)*(x)
int main()
{printf("%d\n", SQUARE(5 + 1));//不要吝啬括号,不加括号有时候可能导致优先级的错误printf("%lf\n", SQUARE(5.0));//宏定义不限制类型return 0;
}

这里 它就是一个宏 它允许把参数替换到文本中去 这种实现通常称为宏

我们在定义宏的时候一定要注意括号

#define DOUBLE(x) ((x)+(x))
int main()
{printf("%d\n", 10 * DOUBLE(3));//最好能把整体也加上括号return 0;
}

这题如果不在宏定义时加上整体的一个大括号就会导致输出结果的错误 计算成33

但实际上我们的要求是60

这里还有要注意的一点 注释中的宏是不会被替换的

1.4 #define 的副作用

我们写出以下代码

#define Max(x,y)((x)>(y))?(x):(y)int main()
{int a = 5;int b = 8;int c= Max(a++, b++);printf("%d\n", a);printf("%d\n", b);printf("%d\n", c);return 0;
}

这里输出结果如下

我们可以发现 其实b是++了两次的

这里就是宏的一个小缺陷

1.5 宏和函数对比

宏通常用于比较简单的运算

例如求两个数中的较大值

为什么这样子呢?

因为

1 宏在规模和速度方面更胜一筹
2 函数必须要声明类型 而宏不用

当然宏也有缺点

  1. 每次使用宏的时候一份宏的代码将会被插入到程序中 除非宏比较短 可能大幅度增加程序的长度
  2. 宏无法调试
  3. 宏无类型定义 不够眼睛
  4. 宏可能会带来操作符优先级的问题 导致程序出错

 以上便是本文所有内容了,如有错误请各位大佬不吝赐教,感谢留言

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

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

相关文章

用 Python 和 AkShare 进行个股数据清洗:源码剖析和建议优化

这是《个股清洗源码》一个获取股票买卖盘信息并将其打印到控制台并保存到文件的脚本。 下面我们来对源码进行剖析 先复习一下源码 import os import akshare as ak from akshare import stock_bid_ask_em from datetime import datetime import pandas as pd from io import …

类和对象中篇

类的六个默认成员函数 如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数 ①初始化和清理:构造函数和析构函数 ②拷贝复制&#x…

无线通信模块通过TCP/IP协议实现与PC端的数据传输

在当今的信息时代,无线通信技术的发展日新月异,为我们的工作和生活带来了极大的便利。其中,无线通信模块通过TCP/IP协议向PC端传送数据已经成为了一种常见的通信方式。本文将详细介绍这一过程的主要步骤和涉及的关键技术,并以WIFI…

Linux——信号量

什么是信号量? 信号量是用来用于同步和互斥的。其实就是一个计数器,进行PV操作,其中P操作就是让计数器–,V操作就是让计数器。 从物理上说明信号量的P、V操作的含义。 P(S)表示申请一个资源,S.value>0表示有资源可…

OBS插件--复合模糊

复合模糊 复合是一款滤镜插件,支持多种模糊类型和多种蒙版效果。支持模糊源的部分显示区域,可以反选区域进行模糊,这个功能对于场景部分区域需要遮盖非常实用。 下面截图演示下操作步骤: 首先,打开 OBS直播助手 在…

实现用户个人随机salt生成jwt及鉴别用户权限的实现思路

实现用户个人随机salt生成jwt及鉴别用户权限的实现 盐值是什么? 盐值(salt)是在密码学中用于增加密码安全性的一种随机值。它通常是一个随机生成的字符串,与用户密码结合在一起,然后再进行加密处理。盐值的作用是增加…

【Unity 鼠标输入检测】

Unity 鼠标输入检测 Unity提供了多种方法来检测和处理鼠标输入,允许开发者在游戏中实现对鼠标移动、点击和滚轮滚动的响应。以下是一些基本的鼠标输入检测方法: 1. Input.mousePosition 这个属性返回当前鼠标指针的屏幕坐标。坐标是以像素为单位的&…

【吊打面试官系列】Java高并发篇 - 同步方法和同步块,哪个是更好的选择?

大家好,我是锋哥。今天分享关于 【同步方法和同步块,哪个是更好的选择?】面试题,希望对大家有帮助; 同步方法和同步块,哪个是更好的选择? 同步块是更好的选择,因为它不会锁住整个对象…

Prim算法(Prim‘s Algorithm)

Prim算法(Prims Algorithm),由罗伯特普里姆(Robert C. Prim)于1957年提出,是一种用于构造加权无向图的最小生成树(Minimum Spanning Tree, MST)的贪心算法。最小生成树是一个无环子图…

临近空间相关概念

临近空间概念 距地 20KM-100KM 的临近空间位于内外层空间之中,也称为 超高空、近空间、亚轨道等。 特点就是:纵跨 非电离层和电离层、空气稀薄,存在 臭氧、紫外、辐射等特殊环境 存在 重力波、行星波、大气放电等特殊现象。 临近空间高速飞…

##15 探索高级数据增强技术以提高模型泛化能力

文章目录 前言数据增强的重要性常见的数据增强技术高级数据增强技术在PyTorch中实现数据增强结论 前言 在深度学习领域,数据增强是一种有效的技术,它可以通过在原始数据上应用一系列变换来生成新的训练样本,从而增加数据的多样性&#xff0c…

前端 | 易混词卡片切换

文章目录 📚实现效果📚模块实现解析🐇html🐇css🐇javascript 📚实现效果 绘制单词卡片效果,实现点击左半部分上翻,点击右半部分下翻。 📚模块实现解析 🐇…

品鉴中的个人风格:如何形成自己与众不同的红酒品鉴体验

品鉴云仓酒庄雷盛红酒不仅是一种感官体验,更是一种个人风格的展现。每个人都有自己与众不同的品味和偏好,通过品鉴红酒,我们可以形成自己与众不同的红酒品鉴体验。 要形成自己与众不同的红酒品鉴体验,首先需要勇于尝试不同类型的红…

conda 常用20个命令

conda常用20个命令 这些命令涵盖了Conda环境管理和包管理的常用功能,可帮助你有效地管理Python环境和软件包。 创建环境: conda create --name myenv这个命令用于创建一个名为myenv的新环境。你可以在--name后面指定环境的名称,并在其后加上…

C++语法之在谈const与模版参数

最近一直在复习C的语法,感觉遇到了不少问题,或许是之前没想的这么深。废话不说,开始说正事。 一、再谈const 有些朋友可能有些疑问,不就是const吗?我知道,const可以给非const赋值,反过来不行&…

通过mvn archetype 创建一个spring boot start 工程

mvn archetype https://maven.apache.org/archetype/index.html 遇到的问题 对于想自定义一个spring-boot-start的同学,比如 Springboot自定义Starter启动器 整个过程很繁琐。 定义属性开关增加 spring boot test start插件定义自动装载 spring.factories or org.springfra…

Webpack模块联邦:微前端架构的新选择

Webpack模块联邦(Module Federation)是Webpack 5引入的一项革命性特性,它彻底改变了微前端架构的实现方式。模块联邦允许不同的Web应用程序(或微前端应用)在运行时动态共享代码,无需传统的打包或发布过程中…

javax.net.ssl.SSLException: Received fatal alert: protocol_version已经解决

起因: 在帮别人讲解项目时,将项目的tomcat配置完,点击运行后,报错,信息如标题。 解决办法: 在csdn百度问题,得到的方法主要有几个: 1.jdk要配置在1.8以上; 2.数据库地…

Stable Diffusion是什么?

目录 一、Stable Diffusion是什么? 二、Stable Diffusion的基本原理 三、Stable Diffusion有哪些运用领域? 一、Stable Diffusion是什么? Stable Diffusion是一个先进的人工智能图像生成模型,它能够根据文本描述创造出高质量的图…

Spring IOC容器加载流程原理源码深度剖析

Spring IOC容器加载流程原理源码深度剖析 介绍 在Java开发中,Spring框架是非常常用的一个框架,它提供了很多便捷的功能和特性,其中最重要的就是IOC(Inversion of Control)容器。Spring IOC容器是Spring框架的核心&am…