如何在cpp宏中生成换行符?

时间:2020-03-06 14:24:25  来源:igfitidea点击:

如何编写扩展为包含换行符的cpp宏?

解决方案

使用\,就像这样:

#define my_multiline_macro(a, b, c) \
if (a) { \
    b += c; \
}

C&C ++编译器会忽略不带引号的空格(>>模板问题除外),因此让宏发出换行符实际上没有任何意义。我们可以通过将宏的每一行都用反斜杠结尾来使宏跨越多行,但这不会输出换行符。

不太确定我们在这里要问什么。我们是否需要多行宏?

#define NEWLINE_MACRO(x) line1 \
line2 \
line3

此外,如果我们想在宏中包含文字,请执行以下操作:

#define NEWLINE_MACRO(x) ##x

我们在x中输入的内容将被替换为## x,因此:

NEWLINE_MACRO( line1 ) // is replaced with line1

这有助于制作自定义全局函数,然后只需要更改部分函数名即可。

还:

#define NEWLINE_MACRO(x) #x // stringify x

会在x周围加上引号

C编译器知道空格,但是不能区分空格,制表符或者换行。

如果意思是我该如何在宏的字符串中添加新行,则:

#define SOME_STRING "Some string\n with a new line."

将工作。

在行的末尾使用\。我看过很多C macos,它们在其中使用do ... while(0)

#define foo() do \
{
  //code goes here \
  \
  \
}while(0);

另外,请记住在许多情况下都使用括号。

例子:

#define foo(x) a+b
//should be
#define foo(x) (a+b)

这不可能。仅在查看清单文件或者预处理器输出时才有意义。

编写宏以使它们更易于阅读的一种常用技术是使用\字符将宏继续到下一行。

我(相信我)已经看到编译器在扩展宏中包括换行,以便列出输出。这仅对我们穷人来说有用,他们阅读了扩展的宏以试图了解我们真正要求编译器执行的操作。它对编译器没有影响。

C和C ++语言以相同的方式对待字符串之外的所有空格。就像分隔符一样。