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

时间:2010-02-16 06:42:27

标签: c++ g++ newline c-preprocessor

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

以下代码:

#define A X \ Y

扩展为

X Y

我需要一个宏扩展到

X
Y

8 个答案:

答案 0 :(得分:22)

知道了!

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

anlb anlb

Down arrow

gcc -E -CC nl.c

Down arrow

/*
*/ A /*
*/ B /*
*/ A /*
*/ B

答案 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

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

我有时会使用C宏来生成源代码而不是我不想在PerlM4或其他工具中学习如何执行此操作。

答案 3 :(得分:2)

我很确定CPP是为C而设计的,它不关心新行,而且所有这些都无法处理这类工作。您仍然可以使用一些特殊的标记字符串标记想要的换行符,并将结果通过sedawk来获得您想要的内容。

答案 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,从那以后就没有必要了:

  • 在运行C预处理器后,C与白色空间相比并不关心新行,
  • 您无法从宏等生成预处理器指令。

答案 7 :(得分:-3)

这就是你想要的:

#define A "X \nY"