C语言宏定义中字符串间的反斜杠\有什么作用?
C语言多行宏定义末尾反斜杠的作用
你代码中每行字符串末尾的\是C预处理器识别的行接续符(行拼接符),功能非常明确:
- C语言中
#define定义的宏,默认有效范围仅到当前行的换行符为止,一旦遇到换行就认为宏定义结束。如果需要书写多行内容的宏,必须在每一行(除了宏的最后一行)的末尾加上\,告诉预处理器“下一行和当前行是同一个逻辑行,不要截断宏定义”。 - 注意
\必须是当前行的最后一个字符,后面不能夹带空格、注释等任何内容,否则预处理器无法正确识别,会触发宏定义语法错误。
容易混淆的隐含语法点
你这段宏最终能生成完整的JSON字符串,核心不只是行接续符的作用,还依赖C语言的内置语法规则:所有用双引号包裹、相邻书写的字符串字面量,编译阶段会自动拼接成一整个完整字符串,中间不需要额外加连接运算符。
你的宏经过预处理器处理、消掉所有换行和行接续符之后,实际等价于下面这行逻辑代码:
#define REGISTRER_DEVICE "{" "\"Type\":1" "," "\"Uid\":\"92a5aa89c771de67\"" "," "\"Port\":6787" "," "\"TypeConn\":0" "}"
编译器会自动把这堆相邻的字符串拼接成完整的JSON串:{"Type":1,"Uid":"92a5aa89c771de67","Port":6787,"TypeConn":0}。
改写为char数组的方案
你要弃用宏定义、把JSON内容存到char数组里的话,完全不需要写行尾的\,直接利用字符串自动拼接的特性换行书写即可,可读性和原宏写法一致:
const char registrer_device[] = "{" "\"Type\":1" "," "\"Uid\":\"92a5aa89c771de67\"" "," "\"Port\":6787" "," "\"TypeConn\":0" "}";
如果字符串长度不长,也可以直接写成一整行,只是长文本下可读性较差:
const char registrer_device[] = "{\"Type\":1,\"Uid\":\"92a5aa89c771de67\",\"Port\":6787,\"TypeConn\":0}";
原宏里倒数第二行空行带的\属于冗余写法,改写为数组时直接删掉即可,不会影响内容正确性。
内容的提问来源于stack exchange,提问作者Rod Romo
相关产品推荐
相关产品推荐

