【问题标题】:Few questions about the C++ preprocessor:关于 C++ 预处理器的几个问题:
【发布时间】:2010-10-24 10:28:42
【问题描述】:

关于C++预处理器的几个问题:

  1. 如何让预处理器换行进入预处理代码?
  2. 如何让预处理器在预处理代码中插入一个制表符或多个空格?
  3. 如何让预处理器在预处理代码中插入cmets?

【问题讨论】:

  • 我不知道,但我看到了 3 个问题。
  • 这些问题没有意义。例如,为什么要“插入 cmets”?

标签: c++ c-preprocessor


【解决方案1】:

关于#3,从代码中删除 cmets 是预处理器的责任,我认为不允许将它们留在其中。无论如何,这将是特定于 C++ 编译器的标志你正在使用,所以你应该指定你的环境。

【讨论】:

    【解决方案2】:

    正如其他人所概述的那样,问题 2) 和 3) 没有多大意义。

    至于问题1,我假设你的意思是多行宏,可以这样完成:

    #define FOO line 1 \
        line 2  \
        line 3  \
        ...     \
        line n
    

    注意最后一行缺少的\

    【讨论】:

      【解决方案3】:

      1) 正如蒂姆指出的那样,使用反斜杠

      2) 我不认为你可以

      3)

      #define COMMENT /##/ this is a comment
      #define CPPCOMMENT(c) /##/ c
      #define CCOMMENT(c) /##* c *##/
      
      COMMENT
      CPPCOMMENT(This is a c++ comment)
      CCOMMENT(This is a c comment)
      

      编辑

      2 警告

      1) 不适用于所有编译器。

      2) 不要这样做,这很愚蠢。

      【讨论】:

      • 您的宏在 GCC 4.1.1 中不起作用。而且,我想,在许多其他环境中。
      • 在 VS 2010 中,它们只是半工作——宏实际上变成了 cmets,但它们被预处理器剥离了。所以实际上没有插入任何东西,这违背了整个邪恶混乱的目的。但至少宏不会在那里导致错误。
      • @cHao 它在 GCC 中不起作用的事实是 GCC 的问题。标准中没有定义不应该这样做的理由。如果您设置了 keep cmets 标志,它在 VS 2010 中确实有效,它只会导致无法编译的源文件,因为在预处理后它仍然包含 cmets。但是,如果您获取预处理器的输出,然后再次编译它,它就可以工作。我一开始就没有看到这整个邪恶混乱的目的,所以我不知道如何才能打败这个目的。
      • PigBen,它也因Comeau's online compiler 而失败,这让我很警惕。十年来,我在 Comeau 中发现了一个 bug,但在 VC 中发现了几十个。
      • @PigBen:标准中没有定义它应该的原因。即使你设法找到了一个,至少有两个流行的编译器在它上面窒息,不管标准与否,它都没有用。
      【解决方案4】:

      如何让预处理器换行进入预处理代码?

      为什么?

      如何让预处理器在预处理代码中插入一个制表符或多个空格?

      为什么?

      如何让预处理器将cmets插入到预处理代码中?

      为什么?

      预处理器是一个pre处理器,它在代码转换成机器码之前运行。您要添加的空格和 cmets 不会影响应用程序的输出。

      如果你试图控制gcc -E 的输出或类似的东西,那么你就找错了树。

      【讨论】:

      • 这不是答案。它属于评论。
      【解决方案5】:

      你做错了... PREPROCESSOR 不是为了那个目的。

      【讨论】:

      • 语法不是为了那个目的
      猜你喜欢
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 2011-07-24
      • 2012-07-17
      • 2012-08-31
      • 2016-06-02
      相关资源
      最近更新 更多