说明一下:这些的作用都是编译的预处理阶段进行展开的,不是动态运行时候发挥作用的,说白了,就是编译器提供给我们的代码字符处理手段。方便我们写代码的。
#x 用于给x添加双引号的“”
只能配合用宏定义使用
#define __STRINGIFY(x) #x
__STRINGIFY(123)在代码中就是“123”
我们来想个问题,我们现在有这样需求,想把一个对象A(可以是1,2,haha,也可以是“nihao”),我想让它与另一个对象B通过_连接成一个整体。
那么我们可能会想着这样做:
#defile LINK(A) A_B
想法是好的,但是,编译器预处理时候并不会展开这个宏,也就是不会生效,所以语法规定提供了另外一种机制来连接
A##_B
这个就可以了,如我们期待的自动连接结果一样,所以知道##什么作用了吧。这个还支持级联,a##_##b##_##c##_##d
比如A为123时候,会连接为123_B
这里举个应用实例:
cortex-a内核访问协处理器CP15的寄存器需要用如下指令:
mcr p15, 0, r0, c1, c0, 0
想把它改成C语言实现,那么就是如下:(自己分析一下即可)
/* C语言实现MCR指令 */
#define __MCR(coproc, opcode_1, src, CRn, CRm, opcode_2) \
__ASM volatile ("MCR " __STRINGIFY(p##coproc) ", " __STRINGIFY(opcode_1) ", " \
"%0, " __STRINGIFY(c##CRn) ", " __STRINGIFY(c##CRm) ", " \
__STRINGIFY(opcode_2) \
: : "r" (src) )