c/c++语言开发共享我们可以在很多行中编写宏而不用反斜杠吗?

我在CPP手册中看到了一些例子,我们可以在没有反斜杠的情况下在多行中编写宏体。

#define strange(file) fprintf (file, "%s %d", ... strange(stderr) p, 35) 

输出:

 fprintf (stderr, "%s %d", p, 35) 

它们是特殊情况,如参数宏中的指令还是只允许#define?

对于include指令如果我没有错,它必须总是在一行上声明。

编辑:

来自https://gcc.gnu.org/onlinedocs/cpp/Directives-Within-Macro-Arguments.html

3.9宏观论证中的指令

有时,在宏的参数中使用预处理程序指令很方便 。 C和C ++标准声明在这些情况下的行为是未定义的。 GNU CPP处理宏参数中的任意指令的方式与处理指令的方式完全相同,类似函数的宏调用不存在。

如果在宏调用中重新定义了该宏,则新定义会在参数预扩展时及时生效,但原始定义仍用于参数替换。 这是一个病态的例子:

  #define f(x) xx f (1 #undef f #define f 2 f) 

扩展到

  1 2 1 2 

用上面描述的语义。

这个例子很多。

    没有反斜杠换行符的多行宏定义

    由于在翻译阶段3中注释被替换为空格:

    并且预处理器作为阶段4运行:

    编写像这样的多行宏是可能的,但很荒谬:

     #include  #define possible_but_absurd(a, b) /* comments */ printf("are translated"); /* in phase 3 */ printf(" before phase %d", a); /* (the preprocessor) */ printf(" is run (%s)n", b); /* but why abuse the system? */ int main(void) { printf("%s %s", "Macros can be continued without backslashes", "because commentsn"); possible_but_absurd(4, "ISO/IEC 9899:2011,nSection 5.1.1.2" " Translation phases"); return 0; } 

    在运行时,指出:

     Macros can be continued without backslashes because comments are translated before phase 4 is run (ISO/IEC 9899:2011, Section 5.1.1.2 Translation phases) 

    宏定义中的反斜杠 – 换行符

    翻译阶段1和2也有些相关:

    三字符替换在名义上是相关的,因为??/是反斜杠的三字形。

    这告诉您,在运行阶段4(预处理器)时,宏定义位于单个(逻辑)行上 – 已删除尾部反斜杠 – 换行符组合。

    标准指出阶段“好像” – 编译器的行为必须好像经历了不同的阶段,但许多实现并没有正式将它们完全分开。


    避免GCC扩展

    扩展示例(引自GCC手册)的调用遍布多行,但定义严格在一行。 (这不是GCC扩展,而是完全标准的行为。)

    请注意,如果您是远程理智的,那么您将忽略在宏的调用中放置预处理指令的可能性(示例中为#undef#define )。 它是GCC扩展,完全不可移植。 该标准表明行为未定义。

    附件J.2未定义的行为

    不,这是不可能的。 在每行之前处理行拼接要么被解释为代码文本行或预处理指令,并且在预处理器步骤4(有效预处理算法)内部没有到达行拼接,因为它们之前已被消除。

     #define strange(file) fprintf (file, "%s %d", 

    你的define被解释为一个函数宏,它使预处理fprintf (stderr, "%s %d",替换call strange(stderr) fprintf (stderr, "%s %d", ,.预处理器不知道C语法和语义,它是另一种语言,非turing -完成。

    不行,你不可以。 必须使用反斜杠作为多行预处理器宏的行继续转义字符。

      以上就是c/c++开发分享我们可以在很多行中编写宏而不用反斜杠吗?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/519693.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐