【问题标题】:Output from C preprocessor is not as expectedC 预处理器的输出不符合预期
【发布时间】:2014-10-01 09:51:26
【问题描述】:

我正在尝试使用 C 预处理器进行一些文本处理。然而,它似乎在积极地试图阻挠我。

出于测试目的,我有Test.xml.pre

<document>
  <meta>This is a test.</meta>
  SETTINGS
  <output format="FORMAT" mode="MODE"/>
</document>

然后我有Setup.cpp:

#define FORMAT fmt
#define MODE XL

#define SETTINGS <settings><!-- None yet --></settings>

我希望我能以某种方式运行预处理器并最终得到格式良好的输出。我看到了this question,这使得使用预处理器看起来很容易。但是当我这样做时:

cpp -E -include Setup.cpp Test.xml.pre -o Test.xml

然后我明白了:

# 1 "Test.xml.pre"
# 1 "<command-line>"
# 1 "./Setup.cpp" 1
# 1 "<command-line>" 2
# 1 "Test.xml.pre"
<document>
  <meta>This is a test.</meta>
  <settings><!-- None yet --></settings>
  <output format="FORMAT" mode="MODE"/>
</document>

尽我所能,我无法摆脱顶部的散列线。我也不确定为什么 FORMATMODE 没有扩展。 (SETTINGS 似乎扩展得很好。)

我做错了什么??

PS。以防万一,

cpp (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]

【问题讨论】:

    标签: linux c-preprocessor


    【解决方案1】:

    要摆脱行定义,请使用-P 命令行参数。

    字符串文字中的标识符没有扩展,因此您不能像以前那样使用 FORMAT 和 MODE。但是,这是可行的:

    <document>
      <meta>This is a test.</meta>
      SETTINGS
      <output format=FORMAT mode=MODE/>
    </document>
    

    #define FORMAT "fmt"
    #define MODE "XL"
    #define SETTINGS <settings><!-- None yet --></settings>
    

    得到

    $ cpp -P -E -include Setup.cpp Test.xml.pre -o Test.xml
    $ cat Test.xml
    <document>
      <meta>This is a test.</meta>
      <settings><!-- None yet --></settings>
      <output format="fmt" mode="XL"/>
    </document>
    

    【讨论】:

    • 太棒了!谢谢。有没有办法让其他定义扩展?
    • 抱歉,第二部分忘记回答了:)现在添加。
    猜你喜欢
    • 2011-02-18
    • 2022-01-16
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    相关资源
    最近更新 更多