我有以下问题。我想包含一个多行文本文件#define
,即我需要的是一个存储文本文件值的常量。例子:
File 'f.txt': This\nis\n\nsome\ntext
我想以如下方式初始化一个常量(在编译时)
#define txtfile "This\\nis\\na\\ntextfile"
其中字符串“This\nis\na\ntextfile”是通过连接文件 f.txt 中的行获得的。有没有办法使用预处理器命令/宏来实现这一点?
我有以下问题。我想包含一个多行文本文件#define
,即我需要的是一个存储文本文件值的常量。例子:
File 'f.txt': This\nis\n\nsome\ntext
我想以如下方式初始化一个常量(在编译时)
#define txtfile "This\\nis\\na\\ntextfile"
其中字符串“This\nis\na\ntextfile”是通过连接文件 f.txt 中的行获得的。有没有办法使用预处理器命令/宏来实现这一点?
将 C 程序中的“#include”文本文件视为 char[]以了解可能满足您需求的替代方案。
这不是直接可能的,因为文本文件需要首先处理。您可以编写一个相当简单的脚本来执行适当的转义并添加#define
创建合适的头文件。
通常,您实际上并不需要将文本文件作为预处理器宏扩展,但是,您需要文件数据出现在目标文件中并且可以像extern char[]
.
为此,有两种方法。轻量级的方法是使用像 yasm 这样的汇编程序和incbin
指令来生成一个目标文件,该文件将文件数据作为标记部分。例如:
global f_txt
f_txt:
incbin "f.txt"
然后在C文件中你可以声明:
extern char f_txt[];
更便携的方法是使用一个实用程序,比如xxd -i
将数据转换为 C 文件,其中 char 数组写出“长手”。
您可能需要做的是有一个单独的预处理程序,它接收您的输入文件 ( f.txt
) 和您的特殊源文件 ( program.cppx
) 中的代码部分,例如:
#superdefine txtfile f.txt
您必须自己编写预处理器,但它基本上会根据文件内容将这些#superdefine
行替换为等效的行,生成一个文件,然后您可以将其输入到真正的编译器中。#define
program.cpp
如果您使用 make 变体,这在 UNIX 下很容易实现。使用 IDE 可能不是那么容易。
有人可能会想出一个类似以下的想法:
f.txt:
这个 \ 是 \ 一些 \ 文本 \
代码.c:
#定义文本文件“\ #include "f.txt" "
但我认为这行不通。包含行将被视为字符串。