前言:

熟悉C语言的朋友应该对宏不陌生, 宏在C语言程序开发中是经常使用的,使用其的主要目的是方便程序员的编程工作,并且能在一定程度上提高程序的效率。C语言中提供的宏定义命令是#define。下面就使用宏的几个小细节进行一些讨论。

1,宏中使用()

在宏中,尽量多使用(),不要觉得无所谓或者觉得使用不使用没有什么影响。请切记,在宏中尽量多使用(),这样才能尽量的保证你的宏的正确性。

举个例子:

#define CAL(x,y)   x+y

CAL(2,4)×CAL(2,5)

程序员的本意可能是要计算(2+4)×(2+5),但是事与愿违,这个宏展开来是这样的 2+4×2+5,与所要的结果完全不相符。

比较合理的定义应该是 #define CAL(x,y)   ((x)+(y)),以避免不必要的歧义。

2,重复宏定义

尽量不要重复的定义宏,那样会另程序的可读性变的很差,并且容易出错,难以维护。重复的宏定义以最后一次定义为准。

例子:

#define PI 3.14

#define PI 10.48

那么在程序中PI的值应该是10.48,因为这是最后的定义。

3,危险的宏定义

宏定义在使用不当的时候会很危险,胡乱的定义会混淆程序员的思维,例如:

#define int  char

#define break continue

这样的宏定义是相当的危险,会使程序变的相当的混乱,难以阅读,难以维护。

4,宏中的#与##

宏中的#可以将字符转变成字符串,而##则可以进行宏参数拼接。

例如:

#define SUM(a,b)  printf(" a add b is %d \n ", ((a)+(b)));

在程序中这样使用该宏:SUM(1,2)       则输出为 a add b is 3

请注意引号中的a和b被当作了普通的文本,而不是可以被替换的符号。如果想让a和b成为被替换的符号,可以这样定义该宏:

#define SUM(a,b)  printf(" #a add #b is %d \n ", ((a)+(b)));

在程序中这样使用该宏:SUM(1,2)       则输出为 1 add 2 is 3

和#运算符一样,使用##也可以用于宏的替换部分,该符号可以把两个符号拼接成一个符号。例子如下:

#define NAME(x,y)  x##y

在程序中这样使用该宏:NAME(Steve, Johnson)    则该宏会被展开成这样: SteveJohnson

5,宏定义注意分号;的使用

宏定义中注意分号的使用,在宏定义中胡乱使用分号会使程序出现一些莫名其妙的错误。

例如:

#define SUM(a,b) ((a)+(b));

在程序中这样使用该宏:SUM(a1,b1)+SUM(a2,b2)

这样宏展开后就会变成((a1)+(b1));+((a2)+(b2))         这样程序就会出错。

6,一个有趣的关于宏的测试题:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>#define num 10
#define f(x) #x
#define g(x) f(x)int main()
{printf("f(num)=%s   g(num)=%s  \n",f(num),g(num));
}

这是一个很有趣的关于宏的小题目,大家可以想想输出结果是什么。

我们可以使用命令 gcc -E marco.i marco.c > a.txt 去将预处理的结果存到a.txt文件里去查看,main函数经过预处理的结果是:

int main()
{
        printf("f(num)=%s   g(num)=%s  \n","num","10");
}

我们可以看到f(x) 由于有#符号,因此num没有被替换成10,而g(x) 应该先被替换成f(x),于此同时将num替换成了10,变成了#10,因此结果是num 和 10。

关于C语言中的宏的一点点讨论相关推荐

  1. C语言使用define定义圆周率,C语言中的宏处理

    在C语言中使用宏,我们经常这么做,但是为什么使用宏,他可以做什么,我们或许只是一知半解,下面简单介绍如何在C语言中使用宏预处理器. #define语句 对于define语句,我们已经非常熟悉,一个宏定 ...

  2. c语言中关于宏和内联说法正确的是, 2011年1月高等教育自学考试全国统一命题考试 C++程序设计试题...

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我 ...

  3. C语言怎么判断字符YN,c语言中的宏_详解(转)

    1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define 标识符替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和标 ...

  4. C语言中的宏函数与宏定义

    目录 1.无参宏定义 1.1 无参数宏定义的格式: 1.2 使用说明: 2.带参宏定义 2.1 带参数宏定义的格式: 2.2 使用说明: 3.带参宏定义与函数调用的区别 4.头文件中常用的宏定义 5. ...

  5. C语言中关于宏定义的学习

    1.C语言中宏定义的使用 2.GCC官方文档 3.C语言宏定义的几个坑和特殊用法 转载于:https://www.cnblogs.com/Brandon0807/p/11146344.html

  6. C语言中利用宏,实现一个整数的奇数位和偶数位交换,以及计算结构体中某变量相对于首地址的偏移

    C语言中的自定义宏 自定义宏,令其实现所需功能 1.写一个宏,可以将一个整数字的奇数位和偶数位交换. 2.写一个宏,计算结构体中某变量相对于首地址的偏移. 具体思路1: 首先取出当前数的奇数部分和偶数 ...

  7. 使用C语言中的宏来定位出错信息

    编写一个软件时,软件的健壮性时特别值得考虑的问题.使用C++时可以使用异常捕获机制,在设计完软件的模块架构的时候然后再设计异常捕获架构,一般来说需要设计一个异常捕获网来捕获程序中可能的异常. 对于异常 ...

  8. 一招让你彻底掌握C语言中运用宏以及#与##的妙用

    学习C语言,特别是阅读linux源码的时候,大家经常遇到很多的宏定义,有简单的,当然也有很复杂的. 有事一个宏定义甚至有几十行之多,遇到这种宏定义的大家基本上是一脸懵逼,不知所措,其实想复杂的宏定义没 ...

  9. c语言宏函数怎么传递宏参数_C语言中的宏参数评估

    c语言宏函数怎么传递宏参数 We can define a function like Macro, in which we can pass the arguments. When a Macro ...

最新文章

  1. php中复选框删除数据_checkbox 删除,checkbox_PHP教程
  2. DDOS三种不同类型的攻击行为—Vecloud
  3. HDU 4777 Rabbit Kingdom 树状数组
  4. img写入工具_硬盘有坏道,得用靠谱的修复工具,这3个不会让你失望
  5. 随想录(qemu仿真linux kernel)
  6. python产生随机值-random模块
  7. Atitit 图像指纹识别匹配sift算法 atlks总结
  8. 0.5mm的焊锡丝能吃多大电流_【高考必备】高考物理5大类型的实验要点整理,考前一定要看!...
  9. Oracle中insert into select和select into from的用法
  10. AutoJsPro,阿伟的假期(看广告游戏)脚本实例
  11. Spring warmth
  12. 百度网站优化和360网站优化的排名算法异同之处
  13. 笔记本电脑如何锁定计算机,笔记本电脑怎么锁定关闭触摸板
  14. 一家AI创业公司不平凡的2018年
  15. 2017.08.05
  16. 成功解决tensorflow.python.framework.errors_impl.InvalidArgumentError: slice index 1 of dimension 0 out o
  17. 正点原子OLED显示实验
  18. 什么软件可以打印小学试卷书本?
  19. Visual Studio 2022 的下载
  20. 思科JABBER显示头像配置文件

热门文章

  1. oracle怎么新开账期,oracle成本核算
  2. C语音:for循环实现n个数简单求和
  3. ZYNQ有两个CPU?(二)——OCM共享内存
  4. 2021年低压电工考试题及低压电工报名考试
  5. WER2019上海世界锦标赛
  6. 【无标题】ChatGPT的官网是多少,在国内能使用吗
  7. 谷歌浏览器实现浏览器页面速播放视频
  8. 字符串模板和dom模板的区别
  9. 彩色图像颜色和饱和度调整办法
  10. 【Typora图床设置】Typora图片上传和阿里云OSS对象存储