简介预处理

所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是C语言的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时, 系统将自动引用预处理程序对源程序中的预处理部分作处理, 处理完毕自动进入对源程序的编译。

  C语言提供了多种预处理功能,如宏定义、文件包含、 条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、 移植和调试,也有利于模块化程序设计。本章介绍常用的几种预处理功能。

宏定义
  在C语言源程序中允许用一个标识符来表示一个字符串, 称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换, 这称为“宏代换”或“宏展开”。

  宏定义是由源程序中的宏定义命令完成的。 宏代换是由预处理程序自动完成的。在C语言中,“宏”分为有参数和无参数两种。 下面分别讨论这两种“宏”的定义和调用。

无参宏定义
  无参宏的宏名后不带参数。其定义的一般形式为: #define 标识符 字符串 其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。 “标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。在前面介绍过的符号常量的定义就是一种无参宏定义。 此外,常对程序中反复使用的表达式进行宏定义。例如: # define M (y*y+3*y) 定义M表达式(y*y+3*y)。在编写源程序时,所有的(y*y+3*y)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(y*y+3*y)表达式去置换所有的宏名M,然后再进行编译。
#define M (y*y+3*y)
main(){
int s,y;
printf("input a number: ");
scanf("%d",&y);
s=3*M+4*M+5*M;
printf("s=%d/n",s);
}
  上例程序中首先进行宏定义,定义M表达式(y*y+3*y),在s= 3*M+4*M+5* M中作了宏调用。在预处理时经宏展开后该语句变为:s=3*(y*y+3*y)+4(y*y+3*y)+5(y*y+3*y);但要注意的是,在宏定义中表达式(y*y+3*y)两边的括号不能少。否则会发生错误。
  当作以下定义后: #difine M y*y+3*y在宏展开时将得到下述语句: s=3*y*y+3*y+4*y*y+3*y+5*y*y+3*y;这相当于; 3y2+3y+4y2+3y+5y2+3y;显然与原题意要求不符。计算结果当然是错误的。 因此在作宏定义时必须十分注意。应保证在宏代换之后不发生错误。对于宏定义还要说明以下几点:

1. 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。

2. 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。

3. 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结 束。如要终止其作用域可使用# undef命令,例如: # define PI 3.14159
main() 
{
……
}
# undef PIPI的作用域
f1()
....表示PI只在main函数中有效,在f1中无效。
4. 宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。
#define OK 100
main()
{
printf("OK");
printf("/n");
}
上例中定义宏名OK表示100,但在printf语句中OK被引号括起来,因此不作宏代换。程序的运行结果为:OK这表示把“OK”当字符串处理。

5. 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。例如
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:该项目是基于pytorch深度学习框架实现的视网膜血管分割代码,包括数据预处理、模型训练、模型测试以及可视化等功能,可以在此基础上进一步研究视网膜血管分割算法。最近我把这套代码进行了重构和简化,在比较晦涩的地方也添加了注释,力求任何一个入门者都能看懂。当然也可能存在bug和表述不清的地方,也希望大家能提issue指明问题,我会尽可能快速debug并更新代码,不胜感激。\[1\] 引用\[2\]:简介:本文主要分享我在做视网膜血管分割深度学习算法的过程中,整理出来的一套视网膜血管分割代码。简单介绍一下,我的研究方向是计算机视觉(侧重于语义分割),主要做一些医学图像分割算法和偏工程的机器视觉部署方面的工作,具体研究课题是基于深度学习的视网膜血管分割算法研究。在这,把我的视网膜血管分割代码分享给大家,项目地址: GitHub仓库地址:https://github.com/lee-zq/VesselSeg-Pytorch 。\[2\] 根据引用\[1\]和引用\[2\]的描述,视网膜图像预处理代码是该项目的一部分。这套代码提供了数据预处理的功能,可以用于视网膜血管分割算法的研究。具体的预处理步骤可能包括但不限于以下几个方面: 1. 数据加载:代码可能提供了加载视网膜图像数据集的功能,可以读取图像文件并将其转换为模型可接受的格式。 2. 数据增强:为了增加数据集的多样性和模型的鲁棒性,代码可能包含了数据增强的方法,如随机旋转、翻转、缩放等操作。 3. 图像预处理:在进行视网膜血管分割之前,通常需要对图像进行预处理,以提取有用的特征。这可能包括灰度化、直方图均衡化、滤波等操作。 4. 数据划分:为了进行训练和验证,代码可能会将数据集划分为训练集和验证集。这可能涉及到随机划分、按比例划分等方法。 需要注意的是,具体的视网膜图像预处理代码可能因项目而异,以上只是一些可能的预处理步骤。如果你对具体的代码实现感兴趣,可以参考引用\[1\]和引用\[2\]中提供的项目地址和仓库地址,查看详细的代码实现。 #### 引用[.reference_title] - *1* *2* [视网膜血管分割代码(Pytorch实现)](https://blog.csdn.net/cos_lee/article/details/114075762)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [keras UNET视网膜血管分割调试记录](https://blog.csdn.net/hehehema/article/details/110496663)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值