如何让G ++预处理器在宏中输出换行符?

Mic*_*bak 29 c++ newline g++ c-preprocessor

在gcc/g ++ 4.*中是否有一种方法可以编写一个扩展为多行的宏?

以下代码:

#define A X \ Y
Run Code Online (Sandbox Code Playgroud)

扩展到

X Y
Run Code Online (Sandbox Code Playgroud)

我需要一个宏扩展到

X
Y
Run Code Online (Sandbox Code Playgroud)

Pot*_*ter 22

得到它了!

#define anlb /*
*/ A /*
*/ B

anlb anlb
Run Code Online (Sandbox Code Playgroud)

向下箭头

gcc -E -CC nl.c
Run Code Online (Sandbox Code Playgroud)

向下箭头

/*
*/ A /*
*/ B /*
*/ A /*
*/ B
Run Code Online (Sandbox Code Playgroud)

  • 不错的把戏。我用VC++试过了;虽然可以指示其预处理器使用`/C` 在预处理器输出中保留注释,但它不会在宏中保留注释,因此这一切都以一行结束。 (3认同)
  • 哪个版本适用于此?最新的`g ++`肯定不会.(考虑到我现在正在处理的宏,这是一种耻辱.) (2认同)
  • 确实`-CC`至关重要.[-CC是***不要丢弃评论,包括在宏扩展期间***](http://linux.die.net/man/1/gcc). (2认同)

小智 8

例如,让宏生成一个特殊的标记,__CR__然后将CPP的结果传递到一个脚本中,该脚本将宏转换为真正的换行符,例如sed 's/__CR__/\n/g'.

我发现这对生成一个手工填充的代码模式非常有用.代码可读时更容易.


小智 6

您可以在宏中放置一个魔术字符序列,例如

#define X(y,z) y nl z
Run Code Online (Sandbox Code Playgroud)

gcc -E infile | sed g/s/nl/\n/ > whatever

(也许不完全正确,但是你明白了,对吗?通过sedtr管道输出或者在输出上运行Emacs.)

我这样做有时使用C宏来生成源代码,不,我不想学习如何在PerlM4或其他工具中做到这一点.


Jag*_*ath -5

这是你想要的吗:

#define A "X \nY"
Run Code Online (Sandbox Code Playgroud)

  • `x++; 有什么问题吗?y++;`?编译器不关心空格。 (4认同)