【问题标题】:String Concatenation using Precompiler使用预编译器的字符串连接
【发布时间】:2009-01-17 10:32:40
【问题描述】:

我有以下问题。我想包含一个多行文本文件作为#define,即我需要一个存储文本文件值的常量。示例:

File 'f.txt': This\nis\n\nsome\ntext

我想初始化一个常量(在编译时)

#define txtfile "This\\nis\\na\\ntextfile"

其中字符串“This\nis\na\ntextfile”是通过连接文件 f.txt 中的行获得的。有没有办法使用预处理器命令/宏来实现这一点?

【问题讨论】:

    标签: c++ c-preprocessor string-concatenation


    【解决方案1】:

    查看"#include" a text file in a C program as a char[] 寻找可能满足您需求的替代方案。

    【讨论】:

      【解决方案2】:

      这是不可能的,因为文本文件需要首先处理。您可以编写一个相当简单的脚本来执行适当的转义并添加 #define 创建合适的头文件。

      通常,您实际上并不需要将文本文件作为预处理器宏扩展,但您需要文件数据出现在目标文件中并且可以像extern char[] 一样访问。

      要做到这一点,有两种方法。轻量级的方法是使用带有 incbin 指令的 yasm 之类的汇编程序来生成一个目标文件,该文件将文件数据作为标记部分。例如:

          global f_txt
      f_txt:
          incbin "f.txt"
      

      然后可以在C文件中声明:

      extern char f_txt[];
      

      更便携的方法是使用像 xxd -i 这样的实用程序将数据转换为 C 文件,其中 char 数组写成“长手”。

      【讨论】:

      【解决方案3】:

      您可能需要做的是拥有一个单独的预处理程序,该程序接受您的输入文件 (f.txt) 和特殊源文件 (program.cppx) 中的代码部分,例如:

      #superdefine txtfile f.txt
      

      您必须自己编写预处理器,但它基本上会根据文件内容将#superdefine 行替换为等效的#define 行,从而生成一个文件program.cpp,然后您可以输入真正的编译器。

      如果您使用 make 变体,这在 UNIX 下很容易实现。使用 IDE 可能不是那么容易。

      【讨论】:

        【解决方案4】:

        人们可能会想出如下的想法:

        f.txt:

        这 \ 是 \ 一些 \ 文本 \

        code.c:

        #定义文本文件“\ #include "f.txt" "

        但我认为这行不通。包含行将被视为字符串。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-25
          • 1970-01-01
          • 1970-01-01
          • 2021-11-18
          • 1970-01-01
          相关资源
          最近更新 更多