1:gcc
gcc -E 预处理命令,生成 .i 文件
gcc -S 编译,编译为 .s文件
gcc -c 把预处理,编译,汇编都做了,但是不链接;生成.o 文件
gcc -o 链接 ,指定输出文件,如果不指定文件,就采用默认方法
gcc -I 从指定路径下寻找头文件
-l 链接时搜索该库,最好是-llibrary,紧跟库名,因为分开的方式只为了兼容POSIX,会搜索固定目录和-L指定的目录,
-static 静态链接
-share 可以共享,被用来链接
一般常用-c选项,先编译在链接。因为如果项目多,修改了其中一个文件的话,其他文件都要重新编译后链接。
2: ’#‘ 的作用
#define A(X) #X //相当于把A(X)字符串化为x
#define B(x) Mydata##x //相当于加了个前缀,B(x)变为 Mydatax
3:类型修饰符
auto:
register:
定义快速访问的变量,把这个变量放在寄存器中,但是他不能保证一定能放进去,毕竟寄存器资源很宝贵
static:
限制作用域,变量或函数的生命周期在程序执行期间都存在
修饰局部变量,只对函数内部可见,只初始化一次
修饰函数外部变量,只对该文件可见,链接时不会被多次定义
修饰函数
extern:
外部申明
const:
常量修饰符,变量只读
volatile:
易变的(可见性):
比如有两个线程在执行,一个读变量a,一个写,按照写回策略,线程1可能把数据写到缓存,线程2可能从主存读。它的作用就是告诉cpu不要把变量写到缓存,每次读写数据都从主存里读写,保证数据一致。
不可优化的:告诉编译器不要优化
顺序执行的:相关的代码先执行
int i;// 1
int j;// 2
i++;// 3
j++;// 4
//如果使用volatile,按1324执行。不使用是依次执行。
注意,volatile不具备原子性,原子性需要原子操作或者锁来实现,原子性就是程序执行时,其他程序要么看到它还未执行,要么已经执行完,不能看到中间执行的结果。
4:位运算
<< 左移,相当于*2,空位填0
>>右移,相当于除以2,空位与符号相关,正数填0,负数填1
&、 | 、^ 与、或、异或
&可以用来清零或者保存某几位数据,如
int a = 0x1234;
int b = a & 0xff00;//去出后两位
~ 取反,逐位运算
| 可以用来设置高电平,如
int a;
a=a | (0x1<<5);//设置第五位为高电平
5、