0
点赞
收藏
分享

微信扫一扫

c语言和汇编中的#,##作用


说明一下:这些的作用都是编译的预处理阶段进行展开的,不是动态运行时候发挥作用的,说白了,就是编译器提供给我们的代码字符处理手段方便我们写代码的

#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) )


举报

相关推荐

0 条评论