在Stack.cpp中显式声明会用到的类型:
template class Stack
全放到头文件中
会影响编译速度把实现代码移至一个新头文件中
把Stack.cpp改为.h , 然后在Stack.h里面 “.h” , 这样能保证代码实现和声明在不同的文件中 , 但本质上和上一个解决办法是一样的 。引用其它的
很像C语言的# , 被包含的文件会原模原样的放在当前文件的包含位置
通配符 文件搜索 文件中的特殊变量“VPATH”就是完成这个功能的 , 如果没有指明这个变量 , make只会在当前的目录中去找寻依赖文件和目标文件 。如果定义了这个变量 , 那么 , make就会在当当前目录找不到的情况下 , 到所指定的目录中去找寻文件了 。
VPATH = src:
以上定义了两个目录 , 用冒号分隔 。自动变量
一个比较有用的操作符是“?=” , 先看示例:
FOO ?= bar
其含义是 , 如果FOO没有被定义过 , 那么变量FOO的值就是“bar” , 如果FOO先前被定义过 ,
那么这条语将什么也不做 , 其等价于:
变量值的替换
foo := a.o b.o c.obar := $(foo:.o=.c)
这个示例中 , 我们先定义了一个“ ( f o o ) ” 变 量 , 而 第 二 行 的 意 思 是 把 “ (foo)”变量 , 而第二行的意思是把“ (foo)”变量 , 而第二行的意思是把“(foo)”中所有以“.o”字串“结尾”全部替换成“.c” , 所以我们的“$(bar)”的值就是“a.c b.c c.c” 。
first_second = Helloa = firstb = secondall = $($a_$b)
这里的“KaTeX parse error:group after '_' at2: a_?b”组成了“” , 于是 , $(all)的值就是“Hello” 。
把变量的值再当成变量
x = yy = za := $($(x))
在这个例子中 , ( x ) 的 值 是 “ y ” , 所 以 (x)的值是“y” , 所以 (x)的值是“y” , 所以( ( x ) ) 就 是 (x))就是 (x))就是(y) , 于是 ( a ) 的 值 就 是 “ z ”。( 注 意 , 是 “ x = y ” , 而 不 是 “ x = (a)的值就是“z” 。(注意 , 是“x=y” , 而不是“x= (a)的值就是“z” 。(注意 , 是“x=y” , 而不是“x=(y)”)
追加变量值
objects = main.o foo.o bar.o utils.oobjects += another.o
于是 , 我们的$()值变成:“main.o foo.o bar.o utils.o .o”(.o被追加进去了)
自动生成依赖性
多数的C/C++编译器都支持一个“-M”的选项 , 即自动找寻源文件中包含的头文件 , 并生成一个依赖关系 。
例如 , 如果我们执行下面的命令:
【函数内传入二级指针, 函数内动态生成二维数组】cc -M main.c
其输出是:
main.o : main.c defs.h
如果你使用GNU的C/C++编译器 , 你得用“-MM”参数 , 不然 , “-M”参数会把一些标准库的头文件也包含进来 。
显示命令
通常 , make会把其要执行的命令行在命令执行前输出到屏幕上 。当我们用“@”字符在命令行前 , 那么 , 这个命令将不被make显示出来 , 最具代表性的例子是 , 我们用这个功能来像屏幕显示一些信息 。如:
@echo 正在编译XXX模块......
当make执行时 , 会输出“正在编译XXX模块…”字串 , 但不会输出命令 , 如果没有“@” , 那么 , make将输出:
- 紫禁城内为什么没有烟囱?又为何没有厕所?
- 采用 Linux 6.2 内核Nitrux 2.8 系统发布
- 揭秘杨贵妃两次出轨内幕被唐玄宗赶出皇宫真相
- 票房艺恩,桃姐内地票房多少
- 解密刘备的后宫:谁是昭烈皇帝刘备的贤内助?
- 解密:知名志怪古籍《山海经》包含哪些内容
- IT大咖直播内容盘点:看前IBM、国美架构师如何解析IT学习等难题……
- sd卡寿命一般多久
- oppo运行内存扩展功能利弊
- 二、Vue2.0项目结构内容及配置解析