人人都能学会的编程入门课
胡光
原百度高级算法研发工程师
立即订阅
953 人已学习
课程目录
已更新 15 讲 / 共 32 讲
0/2登录后,你可以任选2讲全文学习。
开篇词 (1讲)
开篇词 | 别闹了,学编程 ≠ 学语言
免费
语言基础篇 (13讲)
01 | 学习编程,我到底该选择哪门语言?
02 | 第一个程序:教你输出彩色的文字
03 | 判断与循环:给你的程序加上处理逻辑
04 | 随机函数:随机实验真的可以算 π 值嘛?
05 | 数组:一秒钟,定义 1000 个变量
06 | 字符串:彻底被你忽略的 printf 的高级用法
做好闭环(一):不看答案可能就白学了
07 | 指针系列(一):记住,指针变量也是变量
08 | 指针系列(二):记住,指针变量也是变量
09 | 函数:自己动手实现低配版 scanf 函数
10 | 预处理命令(上):必须掌握的“黑魔法”,让编译器帮你写代码
11 | 预处理命令(下):必须掌握的“黑魔法”,让编译器帮你写代码
做好闭环(二):函数是压缩的数组,数组是展开的函数
测试篇 (1讲)
期中测试 | 给语言基础篇交一份满分答卷,去迎接新的挑战!
人人都能学会的编程入门课
登录|注册

11 | 预处理命令(下):必须掌握的“黑魔法”,让编译器帮你写代码

胡光 2020-01-30
你好,我是胡光,欢迎回来。最近为了防范疫情,很多人应该都窝在家里吧?春节假期除了娱乐放松,也不要忘记学习提高呀!
上次呢,我们知道了,原来程序的编译,是一个复杂的过程,其中重要的是三个阶段:预处理阶段编译阶段链接阶段
同时,我们也搞清楚了“源代码”和“待编译源码”两个概念的区别,其中“待编译源码”是由“源代码”经过预处理阶段所产生的代码,并且“待编译源码”才是决定程序最终功能的终版代码。
今天呢,我们继续上节课的知识,来具体学习几个重要的,能够影响“待编译源码”内容的预处理命令吧。

本次任务

在正式开始今天课程之前,我们先来回顾一下任务内容:实现一个使用方法和 printf 函数一样的,但是输出信息却比 printf 更加人性化的,更加具体的 log 方法。
具体代码及事例,参考如下:
#include <stdio.h>
void func(int a) {
log("a = %d\n", a);
}
int main() {
int a = 123;
printf("a = %d\n", a);
log("a = %d\n", a);
func(a);
return 0;
a = 123
[main, 10] a = 123
[func, 4] a = 123
通过文稿代码可以看到,经过 log 方法后,我们获得了更多程序信息。但我们的任务是设计完 log 方法以后,请再给这个 log 方法提供一个小开关,使其很方便的打开或者关闭程序中所有 log 的输出信息。
回顾完了任务以后,就让我们一起来进行具体的预处理命令的学习吧。

必知必会,查缺补漏

在上一节,我们明确了 include 文件包含预处理命令的作用。今天,我们将来着重讲解两种预处理命令宏定义条件编译。它们是什么意思呢?不要着急,听我一个个给你解释。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《人人都能学会的编程入门课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(7)

  • 微风漂过
    #define P(item) printf("%s = %d\n", #item, item);
    #item前面的#,作用是什么?

    作者回复: 是把iterm原本要替换的内容变成对应的字符串。你可以自己写一个小的实验性程序,试一下#的作用。

    2020-02-05
  • 潮汐
    看宏里的代码意图,是要获取参数a的类型(类型文本值,整型int,字符型char...)。可猜出__typeof(a)用于获取a的数据类型值。

    作者回复: 正确!d(^_^o)

    2020-02-01
  • 徐洲更
    __typeof(a) 用于获取a的变量类型
    C语言的变量要定义后才能用, swap宏是一个适用于多种数据结构的宏,因此需要根据具体变量声明具体的变量类型

    作者回复: d(^_^o)没问题!

    2020-01-30
  • 栾~龟虽寿!
    我认为log函数,有两个形参,我们只输入了一个,这个错误,对不?

    作者回复: 既然需求是做一个使用方式和printf一样的函数,printf支持单个参数的形式,log也应该支持。所以,传入一个参数没问题。

    2020-01-30
    1
  • Aaron Shan
    #define MAX(a, b) ((a) > (b) ? (a) : (b))
    给所有变量加上括号,保证代入宏的每个变量都是相互独立

    作者回复: 已经很棒了,你的答案应该可以正确的输出样例中的前四行,后两行:
    P(MAX(a++, 5)); MAX(a++, 5) = 6
    P(a); --> a = 7
    你的这个方法就不行了。

    2020-01-30
  • Geek_Andy_Lee00
    猜测__typeof(a)函数的作用是声明变量,因为我删掉这段代码后,编译:[Error] '__temp' undeclared (first use in this function)。“搞事情”没搞成 - _ -

    作者回复: 哈哈哈,猜测差不多正确。你可以吧 __typeof 看成是类型,就是 int 或者 double 或者是别的什么类型,具体是什么类型呢,根据 __typeof 括号中的表达式来决定。也就是说,其中 a 要是整型,那么 __typeof(a) 最终会被替换成为 int。

    2020-01-30
  • 奔跑的八戒
    看完,睡觉。明天再消化!

    作者回复: d(^_^o)

    2020-01-30
收起评论
7
返回
顶部