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

最近在学习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)宏不存在类型问题,宏名无类型,宏的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可,宏定义时,字符串可以是任何类型的数据。

你可能感兴趣的:(宏定义中的反斜杠"\"和宏定义的细节说明)