C之预处理

本文详细介绍了C语言中的预处理命令,特别是宏定义的概念、使用方法及其与函数调用的区别。通过具体实例展示了无参数及带参数宏定义的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预处理命令-----C语言与其他的最大区别(可使用预处理命令、具有预处理功能)

作用:改进程序设计环境,提高编程效率。

不是C语言的一部分,不能直接、对其进行编译。在对C程序编译之前进行预处理,再编译。经过预处理的程序不再包括预处理命令。

1.宏定义----专门用于预处理命令,只作字符替换,不分配内存

 (1)无参数宏定义 

    #define 标识符 字符串

  例1:#define PI 3.1415926

  说明:宏名大写,与变量区分;

           宏名代替字符串,字符串可以含任何字符,可以是常数,也可以是表达式;

           只是代替,不做任何检查,在预处理过程中只是替换的操作,如若有错误是在编译过程中检测的;

           末尾没有分号,c编译器在宏展开时默认会在字符串末尾增加";",宏定义的字符串若以";"结尾,则":"也被替换;

           使用在函数外面,作用到整个程序结尾,可用#undef结束作用,规定作用域;

 例2:#include <stdio.h>

         #define R 3.0

         #define PI 3.1415926

         #define L 2*PI *R//可以层叠使用

        void main()

         {

         printf("L=%f\n",L);//在程序中,双撇号中的不会替换

          } 

  (2)带参数的宏定义

    #define 宏名(形参表) 字符串

   实参可以是常量、变量、表达式。

  例3:#include<stdio.h>

         #define PI 3.1415926

         #define S(r) PI*r*r//定义时宏名与带参数的括号之间不可有空格,即S与(r)之间,否则,空格+(r)都被当做代替字符的内容。

         void main()

        {

         float a,area;

         a=3.4;

area=S(a);//经宏展开:area=3.1415926*a*a

printf("r=%f\n,area=%f\n",a,area);

}

注意:如果实参为a+b,则area=S(a+b),此时宏展开则为:area=3.1415926*a+b*a+b,与实际不符,所以形参要加括号,即为:#define S(r) PI*(r)*(r)

  带参数的宏与函数调用的区别:

(代表简短表达式比较合适)

函数调用

无需运算,只是一般的替换

需先求出实参表达式的值,代入形参

宏展开在程序运行前进行,无内存分配、无值传递

程序运行时处理,为形参分配临时存储空间

形参、实参类型随意,无一致之说

实参、形参都要定义类型,且两者一致

可多个结果产生

只一个返回值

每宏展开一次,源程序增长一次

宏替换不占运行时间,只占编译时间

占运行时间(分配内存、保留现场、值传递、返回)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值