美文网首页
宏定义中的反斜杠"\"和宏定义的细节说明

宏定义中的反斜杠"\"和宏定义的细节说明

作者: Wonshington | 来源:发表于2018-12-28 22:05 被阅读29次

最近在学习CUDA编程,于是写了如下代码:

#define CHECK(call)                                                                                      \

{                                                                                                                         \

const cudaError_t error = call;                                                                        \

if (error != cudaSuccess)                                                                                \

{                                                                                                                         \

printf("Error: %s: %d, ", _FILE_, _LINE_);                                                    \

printf("code: %d,reason: %s\n", error, cudaGetErrorString(error));          \

exit(1);                                                                                                              \

}                                                                                                                        \

}                                                                                                                        \

我们可以看到,每行后面都加了一个“\”,这是为什么呢,如果不加这些“\”程序就会报错。其实这是宏定义的一个细节,也可以理解为“继续符”的意思,表示本行与下一行连接起来。

在阅读C语言代码经常可以看到代码中出现反斜杠"\",不是很明白它的意思,遂对反斜杠"\"的意义和用法进行查询和总结记录。

反斜杠"\"主要有以下几个意思:


1. 转义字符

非常常用的一种用法,在反斜杠后面加一个字符,表示一些特定的意思,如:

\n 换行符(LF)

\r 回车(CR) ,相当于键盘上的"Enter"

\t 跳到下一个TAB位置

\0 空字符(NULL)

\' 单引号(撇号)

\" 双引号

\\ 代表一个反斜线字符''\' 等,详细可百度“转义字符”。

例:

a.

printf("Hello World!");

printf("Hello World!");

输出:

Hello World!Hello World!

b.

printf("Hello World!\n");

printf("Hello World!\n");

输出:

Hello World!

Hello World!


2. 继续符

可用于一行的结尾,表示本行与下一行连接起来

C语言中以 ; 作为语句的结束,不以行为单位结束,当一行的内容太长不方便写在一行时可使用反斜杠"\"作为继续符

例如:STM32官方库文件"stm32f30x_usart.h"有如下一段:

#define IS_USART_123_PERIPH(PERIPH) (((PERIPH) == USART1) || \

((PERIPH) == USART2) || \

((PERIPH) == USART3))

写成一行意义完全相同:

#define IS_USART_123_PERIPH(PERIPH) (((PERIPH) == USART1) || ((PERIPH) == USART2) || ((PERIPH) == USART3))

(因为显示问题为两行,实际应该为一行)


3 宏定义的细节

(1)对于有参数的宏定义,宏定义时,在宏名与带参数的括号之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。

(2)带参数的宏定义只是进行简单的字符替换,宏展开则是在编译前进行的,在展开时并不分配内存单元,不进行值得传递处理,因此替换不会占用运行时间,只占用编译时间。

(3)宏不存在类型问题,宏名无类型,宏的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可,宏定义时,字符串可以是任何类型的数据。

相关文章

  • 宏定义中的反斜杠"\"和宏定义的细节说明

    最近在学习CUDA编程,于是写了如下代码: #define CHECK(call) ...

  • MJRefresh代码总结

    多行宏定义注释 当定义的宏不能一行表达完整时,可以在行的最后加反斜杠,说明下一行继续此宏的定义,最后一行不要加续行...

  • iOS 中宏定义反斜杠( \ )的作用

    iOS中宏定义太长的话用反斜杠( \ )转义,则可写成多行; 写成多行时反斜杠( \ )后面不能有空格,否则编译器...

  • iOS 宏定义反斜杠( \ )的作用

    iOS中宏定义太长的话用反斜杠( \ )转义,则可写成多行; define Animation1Arr(arr) ...

  • c高级自我学习(1)

    1 编译预处理和宏定 #undef指令删除前面定义的宏定义。 无参宏定义:宏名中没有参数。 1,宏定义中宏名用来表...

  • swift&&OC

    宏定义 OC中的宏定义 swift中的宏定义 OC中宏定义的方式,在swift中是不可用的,在swift中,宏定义...

  • 关于弱符号和弱引用

    宏定义 关于上述宏定义的说明 强符号 弱符号 弱引用

  • 宏定义说明

    #ifndef在头文件中的作用 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一...

  • 10/19

    今天老师讲了预处理命令,宏定义分为无参宏定义,带参宏定义和条件编译。宏定义包括宏名和宏展开,和函数相比预处理有很多...

  • 5月31

    今天学习了宏定义 宏定义分为:不带参数的宏定义和带参数的宏定义,不占用任何内存空间,宏定义时不加分号。 #defi...

网友评论

      本文标题:宏定义中的反斜杠"\"和宏定义的细节说明

      本文链接:https://www.haomeiwen.com/subject/szcylqtx.html