C语言-2

82 阅读2分钟

1、除了#define还有哪些预处理器呢?

#ifndef:如果没有定义宏,返回真
#include:包含一个源代码
#undef:取消定义的宏
#ifdef:如果定义了宏,返回真
#if:如果条件为真,则编译下面代码
#else:#if的替代方案
#elif:如果前面的#if条件不为真,当前条件为真,则编译下面代码
#endif:结束一个#if。。。#else编译块
#error:当遇到标准错误时,输出错误消息
#pragma:使用标准化方法,向编译器发布特殊的命令到编译器中

2、C存储类

auto:所有局部变量默认的存储类
register:定义在寄存器中的局部变量
static:指示编译器在程序的生命周期内保持局部变量的存在,当 static 修饰全局变量时,
会使变量的作用域限制在声明它的文件内
extern:提供一个全局变量的引用,全局变量对所有的程序文件都是可见的

3、定义常量

const

4、typedef

使用它来为类型取一个新的名字,由编译器执行解释的

5、

__attribute__ ((__packed__))修饰后,结构体按1字节对齐,可以节省内存;
保证SDS返回给上层的是指向内存的buf指针,而且可以通过计算可以得到其他变量的指针地址

6、static inline

gcc的static inline的表现行为和C99标准的static inline是一致的。所以这种定义可以放心使用而没有兼容性问题。
要点:
gcc的static inline相对于static函数来说只是在调用时建议编译器进行内联展开;
gcc不会特意为static inline函数生成独立的汇编码,除非出现了必须生成不可的情况(如通过函数指针调用和递归调用);
gcc的static inline函数仅能作用于文件范围内。