2019/04/27 16:02 1.宏的定义:宏定义就是预处理命令的一种,它允许用一个标识符来表示一个字符串。格式如下:

#define name(宏名) stuff(字符串)

本质就是使用宏名去替代字符串的内容,注意是原封不动的替换,不要自己潜意识加上其他的括号啊之类的。 #define宏名 字符串#表示这是一条预处理命令,所有的预处理命令都以#开头。define是预处理命令。宏名是标识符的一种,命名规则和标识符相同。字符串可以是常数、表达式等。 可以发现宏只对宏定义后的行数起作用,且与定义在哪里无关,即使函数不被调用,也可以使用宏。 宏函数不能出现递归。 宏定义的符号,即name部分不会在预处理替换的时候被搜索。 宏定义是#define后面不需要加上“;”,不然分号也会被替代进去。 2.宏函数的申明: 宏函数申明格式:

#define name ( parament-list ) stuff

parament-list为参数表,可以包含多个参数,他们会在stuff出现

#的用法 首先要理解一个原则,即邻近字符串连接原则 在C语言中 printf(“hello”” world!”“\n”); 这句话是合法的 打印结果为: hello world!

#define PRINT(FORMAT, VALUE) printf("the value of " #VALUE " is "FORMAT"\n", VALUE)

int main()

{

int i = 0;

PRINT("%d", i + 3);

return 0;

}

所以我们可以看出来#的作用: 将一个宏参数变成一个对应的字符串 在上述例子中: #VALUE被替换成了“i + 3” 别忘了被替换的时候i + 3两边加上了双引号 ##的用法

#define ADD_TO_AN(num, value) a##num += value

int main()

{

int a1 = 0;

int a2 = 0;

ADD_TO_AN(1, 5);

ADD_TO_AN(2, 6);

return 0;

}

解释一下上面这段代码

假设有一个变量叫a1

此时代码片段为ADD_TO_AN(1, 5)

即替换为a1 += 5,给a1变量增加5

同理ADD_TO_AN(2, 6)则替换成a2 += 6

##的作用 将##两边的字符连在一起作为一个标识符 前提连接后的标识符必须合法,否则编译出现标识符未定义

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

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

宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。

宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换,例如:

#include #define OK 100

int main()

{

printf("OK\n");

return 0;

}

该例中定义宏名OK表示100,但在 printf 语句中 OK 被引号括起来,因此不作宏代换,而作为字符串处理。 5) 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名,在宏展开时由预处理程序层层代换。 6) 习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母。 7) 可用宏定义表示数据类型,使书写方便。例如:#define UINT unsigned int 在程序中可用UINT作变量说明:UINT a, b; 应注意用宏定义表示数据类型和用typedef定义数据说明符的区别。宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。

c语言ok未定义标识符,C语言中宏的相关知识 - osc_y7ckpzr9的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. c语言0阶乘分之一前三十项,MuPAD使用总结 - osc_wws45aot的个人空间 - OSCHINA - 中文开源技术交流社区...

    MuPAD使用总结 一.打开notebook界面的方法: 二.notebook界面的三种区域 (一).输入区域 输入区域在打开来的时候就有,就是 ,但是之后如果还想再加,可以点击上方红色框内的图标. ...

  2. c语言怎样将字符串存入指针属猪,字符数组全排列 - Lu堅的个人空间 - OSCHINA - 中文开源技术交流社区...

    // win32Console.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include //参数为引用,函数调用多,所以定义我内联 ...

  3. 用c语言编写oj成绩排名,OJ题:成绩排序 - 杨源鑫的个人空间 - OSCHINA - 中文开源技术交流社区...

    题目描述 查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理. 例示: jack 70 peter 96 Tom 70 smit ...

  4. java实现自举_实现语言的自举 - 沙枣的个人空间 - OSCHINA - 中文开源技术交流社区...

    几乎所有的语言项目,其核心都是用更底层的语言写的. 底层语言大部分是 C,C++,而扩展这门语言的核心,就要用另外一种语言 去写.这给语言设计者较大的挑战. 开发语言必须具备底层语言的编写能力,而为了 ...

  5. 按照c语言规首字母只能是,C语言--指针 - osc_nbqoh20k的个人空间 - OSCHINA - 中文开源技术交流社区...

    [TOC] #知识内容总结 ##为什么要学习指针? 我们已经学习了如何用数组存放多个相同类型的数据并进行运算,但数组的长度在定义时必须给定以后不能再改变.如果事先无法确定需要处理数据数量,应该如何处理 ...

  6. c语言处理字符串函数的头文件,C语言字符处理函数 - 20131125的个人空间 - OSCHINA - 中文开源技术交流社区...

    C语言提供了丰富的字符串处理函数, 大致可分为字符串的输入.输出.合并.修改.比较.转换.复制.搜索几类. 使用这些函数可大大减轻编程的负担.用于输入输出的字符串函数,在使用前应包含头文件" ...

  7. c 调用mysql密码为空_C语言连MySQL - osc_srnunz15的个人空间 - OSCHINA - 中文开源技术交流社区...

    连接例程 用C语言连接MySQL数据库包含两个步骤" 初始化一个连接句柄结构: 实际进行连接. 初始化连接句柄 #include MYSQL *mysql_init(MYSQL *); 通常 ...

  8. python语言是由谁设计并领导开发的_python语言概述 - osc_lt3ocv4d的个人空间 - OSCHINA - 中文开源技术交流社区...

    python语言的发展 python语言诞生于1990年,由Guide van Rossum设计并领导开发. python语言是开源项目的优秀代表,其解释器的全部代码都是开源的. 编写Hello程序 ...

  9. c语言第三次作业(循环),C语言——第三次作业 - osc_kt69pvbx的个人空间 - OSCHINA - 中文开源技术交流社区...

    #作业要求一# 题目6-1 输出月份英文名 题目6-2 查找星期 题目6-3 计算最长的字符串长度 题目6-4 指定位置输出字符串 作业:C高级第三次作业(2)没有思路,知识点也没有明白,未完成. # ...

最新文章

  1. tools.jar seem to ....
  2. Can't pickle local object 'CDLL.__init__.locals._FuncPtr'
  3. 电磁场与电磁波第四章 时变电磁场
  4. 第46讲:遇到动态页面怎么办?详解渲染页面爬取
  5. 湖北大学计算机学院胡院长,学院召开新一届领导干部任命宣布大会
  6. Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)
  7. java实现extended smtp_java实现发送邮件(SMTP)
  8. micropython esp32驱动舵机_PCA9685舵机控制板与MicroPython-ESP32-1Z实验室
  9. ImageButton单击切换按钮图片
  10. nn.Conv2d(nc, ndf, 4, 2, 1, bias=False),nc、ndf是什么?
  11. Maven将jar包install到本地仓库deploy到远程仓库命令
  12. UE4 iOS设备的兼容性
  13. IBM虚拟化全接触 实现从虚拟化到云端的数据中心
  14. Ubuntu系统下面软件安装更新命令
  15. redis安装教程(简明扼要,一看就懂)
  16. 上班划水,给男朋友做个数字炸弹游戏
  17. centos7 Rsync服务端和windows cwRsync实现数据同步(增量备份)
  18. 代码 比较工具 在线
  19. Glib学习笔记(1)
  20. python统计元音字母个数_统计字符串中各元音字母(即A,E,I,O,U)的个数。

热门文章

  1. Java中的Selenium / WebDriver示例
  2. 不变性真的意味着线程安全吗?
  3. Java陷阱:内部类中的字段访问
  4. 使用RequestFactory API进行Spring GWT集成
  5. Java最佳实践–字符串性能和精确字符串匹配
  6. xp系统的计算机管理中用户在哪里,WINDOWSXP的用户管理和系统安全设置
  7. 织梦mysql安装教程视频教程_织梦DedeCMSV6系统安装步骤教程
  8. Linux 命令之 apt-get -- APT 软件包管理工具
  9. HH SaaS电商系统的品牌模块设计
  10. html2image乱码问题,HtmlImageGenerator字体乱码问题解决、html2image放linux上乱码问题解决...