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

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

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

    相关文章

      网友评论

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

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