在gcc / g ++ 4. *中是否有办法编写一个扩展为多行的宏?
以下代码:
#define A X \ Y
扩展为
X Y
我需要一个宏扩展到
X
Y
答案 0 :(得分:22)
答案 1 :(得分:8)
让宏生成一个特殊标记,比如说__CR__
,然后将CPP的结果输入到一个脚本中,该脚本将宏转换为真正的换行符,例如sed 's/__CR__/\n/g'
。
我发现这对于生成手工填充的代码模式非常有用。代码可读时非常容易。
答案 2 :(得分:6)
你可以在宏中添加一个神奇的字符序列,例如
#define X(y,z) y nl z
运行gcc -E infile | sed g/s/nl/\n/ > whatever
答案 3 :(得分:2)
我很确定CPP是为C而设计的,它不关心新行,而且所有这些都无法处理这类工作。您仍然可以使用一些特殊的标记字符串标记想要的换行符,并将结果通过sed
或awk
来获得您想要的内容。
答案 4 :(得分:2)
来自docs:
在目前的实施中, 整个扩张出现在一条线上
答案 5 :(得分:2)
认为无法在宏中添加换行符这一事实会产生无法读取的代码,从而使调试预处理器输出变得更加困难。确实,C和C ++可能不关心换行符,但是C预处理器确实如此。
我真的想制作一个输出以下内容的宏ConditionalDefine(x,y)。
#ifdef x
#define y
#endif
以下定义做了一些事情:
#define hash #
#define nl
#define _def_p8(A,B) A ifdef _P8_K60_BOARD_ A define B A endif
#define X_def_p8(A,B) _def_p8(A,B)
#define def_p8(A) X_def_p8(nl hash,A)
扩展以下内容:
def_p8(PTPD_DBGA 0)
结果:
# ifdef _P8_K60_BOARD_ # define PTPD_DBGA 0 # endif
但是如果没有能够在哈希之前放入新的线条,它将无法按预期工作。这也是你必须跳过的箍,以便接近它。
答案 6 :(得分:1)
为什么间距很重要?
X11(旧版本)版本中使用的imake程序使用C预处理器生成makefile,但是imake程序使用了一种特殊的技术,在行的末尾用@@符号表示行结尾,然后是处理预处理器的输出,用换行符替换@@符号。
从这个设计中,我得出结论,没有可靠的方法从C(或C ++)中的扩展宏中获取换行符。实际上,对于C,从那以后就没有必要了:
答案 7 :(得分:-3)
这就是你想要的:
#define A "X \nY"