使用预编译器进行字符串连接

时间:2009-01-17 10:32:41

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

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

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

我希望以

的样式初始化一个常量(在编译时)
#define txtfile "This\\nis\\na\\ntextfile"

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

    global f_txt
f_txt:
    incbin "f.txt"

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

extern char f_txt[];

更便携的方法是使用像xxd -i这样的实用程序将数据转换为C文件,并将char数组写成'long hand'。

答案 2 :(得分:0)

您可能需要做的是有一个单独的预处理器程序,它将您的输入文件(f.txt)和特殊源文件(program.cppx)中的代码部分放在一起:

#superdefine txtfile f.txt

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

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

答案 3 :(得分:-1)

有人可能想出如下的想法:

f.txt:

This \
is \
some \
text \

code.c:

#define txtfile "\
#include "f.txt"
"

但我不认为这会奏效。 include行只会被视为String。