2014-10-01 54 views
0

我正在尝试使用C预处理器来处理某些文本。但是,它似乎在积极试图阻挠我。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] 

回答

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> 
+0

真棒!谢谢。有没有办法让其他定义扩展? – MathematicalOrchid 2014-10-01 10:04:43

+0

对不起,忘了回答第二部分:)现在补充。 – jlahd 2014-10-01 10:09:18