在替换文本之前使用#时宏终止宏调用不正确

时间:2019-06-09 13:24:43

标签: c macros

我是C的新手,所以这个问题可能很愚蠢。不过,我正在尝试使用Macro。

我当时使用#将替换文本制成带引号的字符串,并利用宏将在适当的地方自动添加转义字符的功能。

在VS2019中,以下代码给我一个错误,指出错误终止了宏调用。为什么会这样?

#include <stdio.h>

#define toStr(x) #x

main(){
    printf(toStr(the "\" is the escape character));
}

1 个答案:

答案 0 :(得分:2)

正如@alinsoar在其评论中提到的那样,文本字符串未正确编写。转义字符'\'根据规则转义后面的文本。结果是,当您拥有"\"时,所指定的是反斜杠后面的引号被转义,这导致文本字符串没有终止引号。参见How to print out a slash (/ or \) in C?

要实际打印转义字符,您需要像"\\"中那样对它进行转义,这将导致打印单个转义字符,并且文本字符串也应正确地用引号引起来。

请参见C Preprocessor, Stringify the result of a macro,其中提供了有关C预处理程序的Stringify运算符的信息,这是用于宏扩展的#的作用。

您应该查看转义字符及其在C中的用法的各种规则。C++的此列表与C的列表几乎相同。https://en.cppreference.com/w/cpp/language/escape

另请参见Explain Backslash in C