如何在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 ++语言以相同的方式对待字符串之外的所有空格。就像分隔符一样。