C预处理器小记

#define

#define name stuff

当遇到name时,预处理器将之换位stuff
当stuff很长时,除了最后一行之外,每行的末尾都要加一个反斜杠

1.宏定义

#define name(list) stuff

#define square(x)  x * x

参数列表的左括号必须与name相邻,如果二者之间有任何空白,参数列表会被解释为stuff的一部分。
宏中,将x直接换到后面表达式中
eg. a = square(5+1)
运算过程:a = 5+1*5+1 = 11
注意括号的加舍
2.宏替换
(1)调用宏时,首先对参数进行检查,任何包含由#define定义的符号将会被替换;替换文本插入到程序中原来文本的位置,宏的参数名被它们的值所替代;最后,再次对结果文本进行扫描,若包含由#define定义的符号,将重复上述流程。
(2)宏中不能出现递归,预处理器搜索由#define定义的符号时,字符串常量的内容不进行检查。
(3)## 结构把位于它两边的符号链接成一个符号。

#define ADD(sum_number, value) \
		sum ## sum_number += value

ADD(5,25);

最后一条语句将25加到sum5
3.宏与函数

#define MAX(a,b)     ((a) > (b) ? (a) : (b))

函数必须声明为某种类型,宏定义可用于多种类型,它与类型无关。
定义宏时没有“;”,调用宏时有“;”
4带副作用的宏参数

#define MAX(a,b)     ((a) > (b) ? (a) : (b))
x = 5;
y = 8;
z = MAX(x++,y++);

程序运行后会发现
x=6,y=10,z=9
原因如下:
z = ( (x++) > (y++) ? (x++) : (y++) )
5.#undef

#undef name

该函数用于移除一个宏定义。
7.条件编译

#if constant_expression
		statement
#endif

constant_expression为常量表达式由预处理器进行求值,
常量表达式为字面值常量或者由#define定义的符号,变量在执行之前无法获得值,那它就是非法的。
其他结构

#if constant_expression
		statement
#elif constant_expression
		other statement
#else
		other statement
#endif

8.是否被定义

#if defined(synbol)
#ifdef symbol

两个表达式作用时一样的
9.嵌套指令

#ifdef   opt1
		...
#else    
		...
#endif

文件包含

1.定义
#include 指令使另一个文件的内容被编译,替换到该位置。其过程为:预处理器删除这条指令,并用包含在文件的内容取而代之。
2.使用方法
函数库头文件
#define
本地文件
#define “file”
3.使用条件编译消除头文件的多次引用。

小结

1.#argument 结构由预处理转化为字符串常量“argument”,##用于把它两边的文本粘贴成同一个标识符。
2.#error指令在编译时产生一条错误信息,信息中包含你所选中的文本
3.#line指令告诉编译器下一行输入的行号,若加上了可选的内容,就作为编译器输入源文件的名字
4.#program指令允许编译器提供不标准的处理过程,比如一个函数插入内联的汇编代码。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译生成代码。编译将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.java的Java类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值