【问题标题】:C preprocessor: removing quotes from an argumentC 预处理器:从参数中删除引号
【发布时间】:2011-01-01 04:48:18
【问题描述】:

我正在为我的构建系统滥用 C 预处理器来从同一个源文件生成“自述”纯文本文件和网页。结构是这样的:

实际定义在data.h:

#define WEBSITE "http://example.com"

请注意,URL 中的// 必须被引用,否则将被视为评论的开始。在参数中使用, 时也会出现类似的问题;引号是必需的,否则逗号将被视为参数分隔符。

使用这个头文件,一个文件readme.txt.pp通过C预处理器运行:

#include "data.h"
Visit the website at WEBSITE!

当然,预处理器的输出是:

Visit the website at "http://example.com"!

引号出现在输出中。有什么方法或解决方法可以让这段代码给出输出:

Visit the website at http://example.com!

我正在使用 Visual C++ 2008。我知道预处理器不是这项工作的理想工具;也欢迎使用其他内置 VC++ 功能的建议。 (我用 XSLT 尝试了 XML,但不可能将一个 XML 文件包含到另一个文件中,这是一个阻碍。)

【问题讨论】:

    标签: macros c-preprocessor quotes


    【解决方案1】:

    关于 XSLT,看看 document() 函数来读取多个源文档。

    我认为没有任何方法可以从WEBSITE 的值中删除引号,因为它们存在于宏的定义中。您可以考虑使用 m4 宏处理器而不是 C 预处理器。

    【讨论】:

    • document() 是救生员!现在恢复到 XSLT :)
    【解决方案2】:

    Thomas 可能迟到了,不过,这对于像我这样最近遇到这个问题的人来说可能仍然有用...

    试试这个:

    #define DUMMY  
    #define WEBSITE http:/DUMMY/example.com  
    

    所以行注释消失了,预处理器将 DUMMY 解析为空。

    【讨论】:

      【解决方案3】:

      如果可能,请尝试禁用 C++ 样式的 cmets。我不知道它在 VS 中是如何工作的,但是使用 GCC 编译器我可以将 -std=c89 标志传递给 gcc 以禁用 C++ 样式的 cmets,从而使

      #define WEBSITE http://example.com
      

      可能。

      【讨论】:

      • 是,但不是#define SOMETEXT Hello, world!,因为逗号。
      猜你喜欢
      • 2011-10-04
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      相关资源
      最近更新 更多