C++学习笔记
Make
$ make ex1
# or this one too
$ CFLAGS="-Wall" make ex1
第一个命令中你告诉make,“我想创建名为ex1的文件”。于是Make执行下面的动作:
- 文件
ex1存在吗? - 没有。好的,有没有其他文件以
ex1开头? - 有,叫做
ex1.c。我知道如何构建.c文件吗? - 是的,我会运行命令
cc ex1.c -o ex1来构建它。 - 我将使用
cc从ex1.c文件来为你构建ex1。
每次执行make指令之前都会读取一遍Makefile文件
可以使用Makefile来简化操作
CFLAGS=-Wall -g
clean:
rm -f ex1
注:
rm -f ex1指令前是TAB
创建Makefile文件后再次运行make
$ make clean
rm -f ex1
$ make ex1
cc -Wall -g ex1.c -o ex1
ex1.c: In function 'main':
ex1.c:3: warning: implicit declaration of function 'puts'
构建所有项目
可以用all来表示所有构建项目操作。当只使用make时,会默认第一个指令all,all需要ex1,ex1需要ex1.c这样可以构建所有项目
CFLAGS=-Wall -g
all:ex1
ex1:ex1.c
gcc -o ex1 ex1.c
clean:
rm -f ex1
宏
两级宏定义
这个技术是GNU CPP手册推荐的做法
#define str_temp(x) #x
#define str(x) str_temp(x)
不直接定义#define str(x) #x的原因是C标准规定(ISO/IEC 9899:2011 §6.10.3.1):当参数被字符串化操作符#处理时,该参数不会被宏展开
直接定义的展开过程
#define NUM 123
#define str(x) #x
// 展开步骤:
str(NUM) → #NUM → "NUM" // NUM没有被展开
两级定义的展开过程
#define NUM 123
#define str_temp(x) #x
#define str(x) str_temp(x)
// 展开步骤:
str(NUM) → str_temp(123) → #123 → "123" // 先展开NUM参数

浙公网安备 33010602011771号