C笔记系列六:编译预处理

C中的预处理均以#开头,末尾不加;。它们可出现在程序中的任何位置,其作用域是自出现点到所有源程序的末尾。
编译预处理是在编译前对源程序进行的一些加工,由预处理程序来处理

宏定义

不带参数

定义:#define 宏名 字符串
如:#define PI 3.141592653589793
编译预处理程序遇到宏时,就用其代表的字符串(无双引号)替换,即所谓的宏替换
注意:

  • 宏定义是用宏名代替字符串,宏扩展时仅作简单替换,不做语法检查。语法检查在编译时进行
  • 宏定义不是c语句,后面不能有;,否则,会连同;一起替换。如:#define PI 3.1416;,则return (PI * r * r);会被替换成return (3.1419; * r * r);
  • 宏定义可以引用已定义好的宏名,如:
    c
    #define PI 3.14
    #define R 2.0
    #define AREA PI * R * R

带参数

定义:#define 宏名(参数列表) 字符串
如:#define max (x,y) ((x) > (y) ? (x) : (y))
注意:

  • 宏名与(参数列表)之间不能有空格,若有,则会将(参数列表)视为字符串的一部分被替换,即效果等价于一个不带参数的宏替换。如:
#define max (x,y) ((x) > (y) ? (x) : (y))
printf(max(2, 3));
=> printf((x,y) ((x) > (y) ? (x) : (y))(2, 3));
  • 整个宏扩展及各参数均要用()括起来。否则如下:
#define square(x) x*x
a = square(n+1);
=> a = n+1*n+1;
  • 宏扩展最外面的括号也必需,否则:
#define square(x) (x)*(x)
a = 27 / square(3);
=> a = 27 / (3)*(3);
  • 宏调用时是以实参替代形参,而非值传递

宏调用与一般函数调用的区别:

  • 时空效率不同:宏替换时要用宏体去替换宏名,这往往会使程序体积膨胀,加大系统存储开销。但它不像函数调用要进行参数传递、保存现场、返回等操作,所有时间效率比函数高。故,通常对简洁的表达式,以及在调用频率高、要求快速响应的场合,才用宏调用比采用函数调用合适
  • 宏虽可带有参数,但是宏替换只是进行字符串替换,不作任何其它操作,如参数值的计算、传递等

解除宏定义

定义:#undef 宏定义名
如:

int main() {
#define PI 3.14
    a = PI * 2 * 2;  // 正确
#undef PI
    b = PI * 2 * 2;  // 错误,PI宏定义已被解除,不存在
    return 0;
}

文件包含

文件包含,即一个源文件可以将另一个源文件的全部内容包含到自己的文件中。
主要有两种包含方式

  1. #include "文件标识":文件标识中包含文件路径。按照这种格式定义时,预处理程序首先在原来的源文件目录中检索该指定的文件;若未找到,则按照系统指定的标准方式检索其它文件目录,直至找到为止。
  2. #include <文件标识>:按此方式指定文件时,预处理程序仅会按照系统指定的标准方式检索文件目录。

故,引用的是系统提供的头文件时,(1)和(2)均可,但推荐(2),因为可减少检索时间;但引用的是自定义文件时,则只能使用(1)

条件定义与条件编译

条件编译使得同一源程序在不同的编译条件下得到不同的目标代码。常是为了增强程序的可移植性或者便于程序的调试

#ifdef 宏名
程序段1       // 若宏名已被 #define 定义,即已经存在,则编译程序会选择编译程序段1,否则编译程序段2 
#else
程序段2
#endif

#ifndef 宏名
程序段1       // 若宏名未被 #define 定义,即不存在,则编译程序会选择编译程序段1,否则编译程序段2 
#else
程序段2
#endif

#if 表达式1
程序段1
#elif 表达式2 
程序段2
#else
程序段3
#endif

其中第三类条件编译的例子如下:

#define A 1
#define B 2
#define C A

#if A == B
程序段1
#elif A == C
程序段2
#else
程序段3
#endif

需注意,由于条件编译是发生在程序执行之前,故表达式中引用的任何变量均无效,只能引用宏定义的符号常量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字乡村和智慧农业的数字化转型是当前农业发展的新趋势,旨在通过应用数字技术,实现农业全流程的再造和全生命周期的管理服务。中国政府高度重视这一领域的发展,提出“数字中国”和“乡村振兴”战略,以提升国家治理能力,推动城乡融合发展。 数字乡村的建设面临乡村治理、基础设施、产业链条和公共服务等方面的问题,需要分阶段实施《数字乡村发展战略纲要》来解决。农业数字化转型的需求包括满足市民对优质农产品的需求、解决产销对接问题、形成优质优价机制、提高农业劳动力素质、打破信息孤岛、提高农业政策服务的精准度和有效性,以及解决农业融资难的问题。 数字乡村建设的关键在于构建“1+3+4+1”工程,即以新技术、新要素、新商业、新农民、新文化、新农村为核心,推进数据融合,强化农业大数据的汇集功能。数字农业大数据解决方案以农业数字底图和数据资源为基础,通过可视化监管,实现区域农业的全面数字化管理。 数字农业大数据架构基于大数据、区块链、GIS和物联网技术,构建农业大数据中心、农业物联网平台和农村综合服务指挥决策平台三大基础平台。农业大数据中心汇聚各类涉农信息资源和业务数据,支持大数据应用。信息采集系统覆盖市、县、乡、村多级,形成高效的农业大数据信息采集体系。 农业物联网平台包括环境监测系统、视频监控系统、预警预报系统和智能控制系统,通过收集和监测数据,实现对农业环境和生产过程的智能化管理。综合服务指挥决策平台利用数据分析和GIS技术,为农业决策提供支持。 数字乡村建设包括三大服务平台:治理服务平台、民生服务平台和产业服务平台。治理服务平台通过大数据和AI技术,实现乡村治理的数字化;民生服务平台利用互联网技术,提供各类民生服务;产业服务平台融合政企关系,支持农业产业发展。 数字乡村的应用场景广泛,包括农业生产过程、农产品流通、农业管理和农村社会服务。农业生产管理系统利用AIoT技术,实现农业生产的标准化和智能化。农产品智慧流通管理系统和溯源管理系统提高流通效率和产品追溯能力。智慧农业管理通过互联网+农业,提升农业管理的科学性和效率。农村社会服务则通过数字化手段,提高农村地区的公共服务水平。 总体而言,数字乡村和智慧农业的建设,不仅能够提升农业生产效率和管理水平,还能够促进农村地区的社会经济发展,实现城乡融合发展,是推动中国农业现代化的重要途径。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值