0

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

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

我想以如下方式初始化一个常量(在编译时)

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

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

4

4 回答 4

2

将 C 程序中的“#include”文本文件视为 char[]以了解可能满足您需求的替代方案。

于 2009-01-17T10:53:37.343 回答
1

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

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

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

    global f_txt
f_txt:
    incbin "f.txt"

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

extern char f_txt[];

更便携的方法是使用一个实用程序,比如xxd -i将数据转换为 C 文件,其中 char 数组写出“长手”。

于 2009-01-17T10:56:22.517 回答
0

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

#superdefine txtfile f.txt

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

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

于 2009-01-17T10:57:28.253 回答
-1

有人可能会想出一个类似以下的想法:

f.txt:

这个 \
是 \
一些 \
文本 \

代码.c:

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

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

于 2009-01-17T10:53:06.907 回答