2021-05-31 C语言预处理全集

在这里插入图片描述
#undef 是用来撤销宏定义的,用法如下:

#define PI 3.141592654// code
#undef PI

//下面的代码就不能用PI 了,它已经被撤销了宏定义。

条件编译
第一种形式:
#ifdef 标识符
程序段1
#else
程序段2
#endif
它的功能是,如果标识符已被#define 命令定义过则对程序段1 进行编译;否则对程序段2
进行编译。如果没有程序段2(它为空),本格式中的#else 可以没有,即可以写为:
#ifdef 标识符
程序段
#endif

第二种形式:
#if 常量表达式
程序段1
#else
程序段2
#endif
它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2 进行
编译。因此可以使程序在不同条件下,完成不同的功能。

至于#elif 命令意义与else if 相同,它形成一个if else-if 阶梯状语句,可进行多种编译选择。

3.#error 预处理
#error 预处理指令的作用是,编译程序时,只要遇到#error 就会生成一个编译错误提
示消息,并停止编译。其语法格式为:
#error error-message
注意,宏串error-message 不用双引号包围。遇到#error 指令时,错误信息被显示,可能同时
还显示编译程序作者预先定义的其他内容。

4 #line 预处理
#line 的作用是改变当前行数和文件名称,它们是在编译程序中预先定义的标识符
命令的基本形式如下:
#line number[“filename”]
其中[]内的文件名可以省略。
例如:
#line 30 a.h
其中,文件名a.h 可以省略不写。
这条指令可以改变当前的行号和文件名,例如上面的这条预处理指令就可以改变当前的行号
为30,文件名是a.h。初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译
器的编写中,我们知道编译器对C 源码编译过程中会产生一些中间文件,通过这条指令,
可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析。

5 #pragma 预处理
它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作
其格式一般为:
#pragma para
其中para 为参数
#pragma message
message 参数:Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:#pragma message(“消息文本”)当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86 这个宏可以用下面的方法
#ifdef _X86
#Pragma message(“_X86 macro activated!”)
#endif
当我们定义了_X86 这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。

6、为什么会有内存对齐?

**原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访
问。**编译器将未对齐的成员向后移,将每一个都成员对齐到自然边界上,从而也导致了整个结构的尺寸变大
尽管会牺牲一点空间(成员之间有部分内存空闲),但提高了性能。
能不能既达到提高性能的目的,又能节约一点空间呢?有一点小技巧可以使用。

struct TestStruct1
{
char c1;
short s;
char c2;
int i;
};
struct TestStruct2
{
char c1;
char c2;
short s;
int i;
};

sizeof(TestStruct1)的值为12,sizeof(TestStruct1)的值为8

7、#运算符
#define SQR(x) printf(“The square of x is %d.\n”, ((x)*(x)));
如果这样使用宏:
SQR(8);
则输出为:
The square of x is 64.

假如你确实希望在字符串中包含宏参数,那我们就可以使用“#”,它可以把语言符号转
化为字符串。上面的例子改一改:
#define SQR(x) printf(“The square of “#x” is %d.\n”, ((x)*(x)));
再使用:
SQR(8);
则输出的是:
The square of 8 is 64.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值