首页 > 其他分享 >预处理和宏(拓展)

预处理和宏(拓展)

时间:2022-11-03 00:47:37浏览次数:47  
标签:__ 定义 MAX deyine 拓展 预处理 表达式 define

预处理

这个阶段需要处理三件事情
1.#define定义的标识符替换
2.文件包含替换
3.去除注释

常见的预定义符号

作用可以用来记录日志信息 以方便找到检查点

__FILE__:当前源文件的路径
__LINE__:当前行行号
__DATE__:文件被编译的日期
__TIME__:文件被编译的时间
__FUNCTION__:当前执行的函数
__STDC__:是否遵守ANSI标准 返回1 否则未定义

条件编译指令

//移除一个宏定义
#undef 宏定义名

//1.单分支
#ifdef 常量表达式
    代码块
#endif

//2.多分支
#ifdef 常量表达式
    代码块
#elif 常量表达式
    代码块
#else 
    代码块
#endif

//3.如果未定义 不参与编译
#ifndef 常量表达式
    语句块
#endif

#if !常量表达式
    语句块
#endif

定义标识符 注意项目

1.结尾不加分号 deyine末尾可能有逗号
#deyine M 100;; 如果加分号后就会成两条语句

2.define定义宏

2.1定义:#deyine MAX(x) xx
2.2原理:将参数替换到文本中 MAX(3)—>3
3
2.2.1如果是 MAX(3+1) —> 替换成 3+13+1
2.2.2最好是将函数每个参数都括起来
MAX(X) ((X)
(X))—> MAX(3+1) --> ((3+1)*(3+1))
2.3宏替换的规则
2.3.1先替换宏定义里的定义的标识符 在进行宏替换
2.4注意
2.4.1宏的参数可以是deyine定义的变量 但是对于宏 不能递归
2.4.2预处理器搜索deyine定义的符号时 字符串常量的内容不能被搜索

3.#和##

3.1字符串自动连接的特点
3.2# 将宏参数对应的字符串 替换到指定位置
3.3## 位于两端的符号合成一个符号
允许宏定义从分离的文本片段创建标识符

//3.2
#define PRINT(x,yORMAT) printy("the value of " #x " is " yORMAT "\n",x)
//PRINT(a,"%d") 此时int a = 10
//the value of a is 10 

//3.3
#define CONCAT(X,Y,Z) X##Y##Z
CONCAT(class,101,101)
//class101101

4.带副作用的宏

4.1引用透明:一个表达式只计算出值,不会影响环境。这种表达式早算晚算都一样(a+b)*(c+d)
4.2副作用:表达式不仅算出一个值,还修改了环境 做了额外的事情 永久性结果

5.宏与函数

5.1宏在进行小型计算的时间比函数调用执行 返回所需时间更少
5.2宏没有类型检查 使用于所有可以进行运算比较的数据类型
函数参数必须是特定类型

6.宏的劣势

6.1宏不可以调试
6.2宏没有优先级 容易出现错误
6.3每次使用都是插入到程序中 如果过长会增加程序的长度(可读性)
6.4宏由于类型无关 也不够严谨

7.宏可以传类型

#define MALLOC(type,num) (type*)malloc(num*sizeof(type))

MALLOC(int,4)

标签:__,定义,MAX,deyine,拓展,预处理,表达式,define
From: https://www.cnblogs.com/worker618/p/16853068.html

相关文章

  • Luogu P5435 基于值域预处理的快速 GCD
    最近做这道题的时候被卡常了,然后突然想起来曾经偶然在陈指导的博客看到过这个\(O(1)\)做\(\gcd\)的方法其实理解了之后还是比较简单的,以下设数的值域为\(S\)首先我们定义......
  • 数据类型的拓展使用
    Lessismore代码要精简易读整数拓展//二进制0b十进制八进制0十六进制0xinti=10;inti2=010;//八进制0inti3=0x10;//......
  • c++从入门到精通——C++对于C语言的增强和拓展
    全局变量检测增强inta;inta=10;C下可以,C++重定义C语言之下,全局变量定义,不会出错。#include<stdio.h>inta;inta=10;intmain(){printf("helloworld!");retu......
  • vue.js拓展无法启用
    vue.js拓展无法启用这里我以自己的谷歌浏览器演示C:\Users\维磊\AppData\Local\Google\Chrome\UserData\Default\Extensions\nhdogjmejiglipccpnnnanhbledajbpd\6.4.5_0......
  • C语言之预处理,头文件
    目录1预处理1.1简介1.2预处理器实例1.3预定义宏1.3.1简介1.3.2不带参数的宏1.3.3参数化的宏1.4预处理器运算符1.4.1宏延续运算符()1.4.2字符串常量化运算符(#)1.......
  • 米联客FMC-3G SDI视频拓展子卡全新上市!
    FMC-3GSDI子卡测试1.1概述使用FMC-3GSDI子卡来实现FPGA通过GTH高速收发器从同轴电缆接收3G-SDI信号,并通过FIFO回环导出SDI信号到同轴电缆输出。1.2外......
  • 预处理之转灰度图
    补充:transform.invert预处理逆操作fromPILimportImagefromtorchvisionimporttransformsimporttorchimportnumpyasnpdeftransform_invert(img_,transform_train......
  • phpstudy集成工具 vscode 插件phpdebug+php拓展xdebug调试
    vscode需要安装phpdebug 服务器环境需要支持xdebugphp.ini配置设置 必须xdebug.remote_enable=Onxdebug.remote_autostart=On注意端口要和launch.json配置......
  • c语言—程序环境和预处理进阶篇—笔记
    这章是一个c语言底层逻辑的总览,比较接近硬件,不难理解,这里给大家推荐一个c语言的在线练习网站​​https://www.dotcpp.com/oj/problemset.html​​因为只有通过大量的练习才......
  • 1、图像预处理ImageDataGenerator
    1、介绍(1)图片生成器,负责生成一个批次一个批次的图片,以生成器的形式给模型训练;(2)对每一个批次的训练图片,适时地进行数据增强处理(dataaugmentation);数据增强处......