makefile学习笔记

概述

C/C++ 编译流程: 编译、汇编、链接

在汇编完成后,会生成中间文件。windows下是.obj,Unix下是.o

编译时,只要源代码的语法正确,编译器就可以编译出中间目标文件。

链接时,主要是链接函数和全局变量。所以,我们可以使用这些中间目标文件( .o 文件或 .obj 文件)来链接我们的应用程序。在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便。所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

参考

基本就是下面的教程的搬运+一点的自己理解


C++中左值和右值的理解

先看看C++ Primer的解释:

C++的表达式要不然是右值,要不然就是左值。这两个名词是从C语言继承过来的,原本是为了帮助记忆:左值可以位于赋值语句的左侧,右值则不能。

在C++语言中,二者的区别就没那么简单了。一个左值表达式的求值结果是一个对象或者一个函数,然而以常量对象为代表的某些左值实际上是不能作为赋值语句的左侧运算对象。此外,虽然某些表达式的求值结果是对象,但它们是右值而非左值。可以做一个简单的归纳;当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。

使用关键字decltype的时候,左值和右值也有所不同。如果表达式的求值结果是左值,decltype作用于该表达式(不是变量)得到一个引用类型。举个例子,假定p的类型是int*,因为解引用运算符生成左值,所以decltype(*p)的结果是int&。另一方面,因为取地址运算符生成右值,所以decltype(&p)的结果int**,也就是说,结果过是一个指向整数指针的指针。


C语言中的位域

表示一个bool值,只要0和1两种状态,但是不得不使用char来表示,这会造成浪费。而位域就是可以让我们精细地控制位大小的方法。

所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

位域的类型不可以是浮点型,可以是整型或字符型。它会像正常的类型一样参与运算,只是比特位不同,运算规则是相同的。