参考中国大学MOOC 浙江大学翁恺C语言程序设计在线课程

1.什么是编译预处理指令

  • #开头的是编译预处理指令
  • 它们不是C语⾔的成分,但是C语⾔程序离不开它们
  • #define⽤来定义⼀个宏

2.用#define定义一个宏

  • #define <名字> <值>
  • 注意没有结尾的分号,因为不是C的语句
  • 名字必须是⼀个单词,值可以是各种东⻄
  • 在C语⾔的编译器开始编译之前,编译预(cpp)会把程序中的名字换成值
  • 完全的⽂本替换

让我们试一下:

#include <stdio.h>
#include <stdlib.h>
#define temp "Hello_world\n"int main()
{printf(temp);system("pause");return 0;
}

不难看出这里编译器所作的只是单纯的文本替换,实际上对于被宏定义的关键字在编译过程中编译器会生成一个中间文件,这个中间文件中是编译器最终面对的需编译代码,宏定义的东西就在这个文件中被替换。这个替换过程也可以叫翻译

让我们来深入理解一下上面的话:

#include <stdio.h>
#include <stdlib.h>
#define temp(x,y) x##y
int main()
{char tem[] = {"Hellow world\n"};printf("%s", temp(t,em));system("pause");return 0;
}

这里引入了一个新字符“##”,它起到的是连接作用。

这是使用宏的一些小细节:

  • 如果⼀个宏的值中有其他的宏的名字,也是会被替换的
  • 如果⼀个宏的值超过⼀⾏,最后⼀⾏之前的⾏末需要加\(不如说加了\之后下一行的字符也会成为替换目标)
  • 宏的值后⾯出现的注释不会被当作宏的值的⼀部分
  • 记得在替换目标外围加括号哦
  • 宏所作的是文本替换(而且不是C的代码),结尾不需要";"。
#include <stdio.h>
#include <stdlib.h>
#define temp0(x) (x)*100
#define temp1(x) (x*100)
int main()
{printf("%d\n", 1000 / temp0(1) );    //预期值1000 / 100 = 10printf("%d\n", temp1(1 + 2) );  //预期值3 * 100 = 300system("pause");return 0;
}

和预期完全不一样,不难看出实际上两个运算做的是这样的:1000 / (1) * 100和 (1 + 2 * 100)

这充分体现了加括号的重要性。

附带常见宏定义:#define MIN(a,b) ((a)>(b)?(b):(a))

从上面的例子看宏甚至可以定义函数但是由于其无法表明变量类型,所以有很大局限性(对解决方法有兴趣可以了解一下inline)

3.帮我们定义好的宏

  • __LINE__
  • __FILE__
  • __DATE__
  • __TIME__
#include <stdio.h>
#include <stdlib.h>
int main()
{printf("%d: %s\n", __LINE__, __FILE__);printf("%s %s\n", __DATE__, __TIME__);system("pause");return 0;
}

【C语言】编译预处理和宏(附带##介绍)相关推荐

  1. 2.c语言编译预处理,c语言第03章-编译预处理2.ppt

    c语言第03章-编译预处理2 第3章 编译预处理 编译预处理是指,编译时,首先对编译预处理命令进行处理,然后再将预处理后的中间结果进行编译,以得到目标代码. 教学目的: 掌握#define.#incl ...

  2. c语言预处理命令12个,C语言编译预处理和预处理命令

    1.预处理概念:编译程序时,编译器将对程序文件作至少两个阶段的编译预处理,预处理程序预处理阶段和编译程序预处理阶段. 预处理程序预处理阶段:C预处理程序先于C编译程序运行.预处理程序从前向后根据预处理 ...

  3. C++编译预处理:宏定义指令、文件包含指令和条件编译指令

     ◆ 不带参数的宏定义:用来产生与一个字符串(即宏名)对应的常量字符串,格式为:    #define 宏名 常量串 ◆ 带参数的宏定义:带参宏定义的形式很象定义一个函数,格式为:    #def ...

  4. c语言编译预处理指令大全,C语言预处理指令

    「今天是学习C语言第 32 天」 当你选择了一种语言,意味着你还选择了一组技术.一个社区.--Joshua Bloch # 预处理 C语言源程序先经过预处理器进行预处理,之后经过编译器编译成二进制可执 ...

  5. c语言编译时打印宏的值

    #pragma message只能打印字符串 "#"可以把内容变成字符串 #define TEST 5 #define PRINT_MACRO_HELPER(x) #x #defi ...

  6. 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  7. 宏定义处理特殊字符 -_c语言编译与预处理命令

    所谓预处理,是指源文件在进行编译的第一遍扫描之前所作的工作,由预处理程序完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分进行处理,处理完毕自动进入对源程序的编译. 在前面 ...

  8. 条件编译宏定义_C语言学习- 预处理指令2 - 条件编译

    上一篇已经介绍了预处理指令中的宏定义,这篇就介绍一下条件编译! 条件编译的概念 在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执 ...

  9. 【C语言关键知识点1】C语言的预处理、编译和链接过程

    1 引言   再一次回顾C语言的关键基础知识,今天带大家深刻的剖析一下C语言的预处理.编译(汇编)和链接的过程,以加深对C语言及编程本质的理解!   学习C语言首先要理解的就是如何将程序员输入的源代码 ...

最新文章

  1. 【转】[退役]纪念我的ACM——headacher@XDU
  2. 虚幻4视频笔记002:精简StarterContent文件夹体积
  3. select检测到可读,调用read的情况
  4. Windows核心编程 第八章 用户方式中线程的同步(下)
  5. 关于函数形参的一些讨论
  6. XCode6 生成prefix.pch文件
  7. 【STM32】外部中断
  8. EA问题的JDK14实例
  9. Delphi 关键 重启 注销
  10. ELK日志系统之使用Rsyslog快速方便的收集Nginx日志
  11. 根据varchar排列是怎么比大小的_骨架大小怎么看?肩宽、胸腔宽、胯宽是关键,加码大骨架穿搭技巧...
  12. c语言转意字符 s,第2章 C语言初探:12、C语言转义字符
  13. idea jar包重新依赖_分布式架构系列:jar包依赖管理
  14. 数据单向安全传输方案
  15. vh和vw是什么单位?
  16. linux下find命令的详细说明
  17. java随机生成数字和字母_使用java如何生成随机的字母数字字符串?
  18. python画太极图
  19. 二维码相机遮罩层快速实现
  20. Oracle 服务器连不上解决方式(远程telnet 1521端口失败)

热门文章

  1. 高德地图文本标注html,设置点标注的文本标签
  2. java 字符串加一个int_Java 输入多行字符串或者多个int数值
  3. python 获取麦克风声音_如何使用python和ffmpeg或simi读取实时麦克风音频音量
  4. linux端口对ip开放,Linux 开放IP端口
  5. pandas 数据处理进阶
  6. InfluxDB-Python 操作实践
  7. mysql基础,DISTINCT关键字
  8. Intellij插件之JRebel
  9. Selenium +Java自动化环境安装
  10. [转]spring入门(六)【springMVC中各数据源配置】