我有以下问题。我想将多行文本文件包含为#define
,即我需要的是一个存储文本文件值的常量。例如:
File 'f.txt': This\nis\n\nsome\ntext
我希望以
的样式初始化一个常量(在编译时)#define txtfile "This\\nis\\na\\ntextfile"
其中字符串“This \ nis \ na \ ntextfile”是通过连接文件f.txt中的行获得的。有没有办法使用预处理器命令/宏来实现这一点?
答案 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。