使用嵌入为字符串变量的本地文件编译程序?

时间:2012-06-19 02:01:02

标签: c++ compiler-construction include

问题应该说明一切。

假设有一个本地文件“mydefaultvalues.txt”,与主项目分开。在主项目中我希望有这样的东西:

 char * defaultvalues = " ... "; // here should be the contents of mydefaultvalues.txt

让编译器与" ... "的实际内容交换mydefaultvalues.txt。可以这样做吗?是否有像编译器指令或什么?

4 个答案:

答案 0 :(得分:4)

不完全是,但你可以这样做:

defaults.h:

#define DEFAULT_VALUES "something something something"

code.c:

#include "defaults.h"

char *defaultvalues = DEFAULT_VALUES;

如果您计划执行此操作,则可以生成或以其他方式创建defaults.h。预处理器只能做这么多。以您理解的形式制作文件将使事情变得更加容易。

答案 1 :(得分:3)

我在Linux上做的伎俩就是在Makefile这行:

defaultvalues.h: defaultvalues.txt
    xxd -i defaultvalues.txt > defaultvalues.h

然后你可以包括:

#include "defaultvalues.h"

已定义unsigned char defaultvalues_txt[];包含文件内容,unsigned int defaultvalues_txt_len;包含文件大小。

请注意,defaultvalues_txt不以空值终止,因此不被视为C字符串。但是既然你也有这个尺寸,这应该不是问题。

编辑:

一个小的变化将允许我有一个以空字符结尾的字符串:

echo "char defaultvalues[] = { " `xxd -i < defaultvalues.txt` ", 0x00 };" > defaultvalues.h

如果文件defaultvalues.txt中存在空字符,显然效果不会很好,但如果它是纯文本则不会发生。

答案 2 :(得分:2)

实现这样的编译时技巧的一种方法是用一些解释性编程语言编写一个简单的脚本(例如Python,Ruby或Perl会做得很好),它可以进行简单的搜索和替换。然后在编译之前运行脚本。

定义您自己的#pramga XYZ指令,该指令由脚本查找,并将其替换为使用字符串中的文件内容声明变量的代码。

char * defaultvalues = ...

其中...包含从给定文本文件中读取的文本字符串。请务必补偿行长,新行,字符串格式字符和其他特殊字符。

编辑:lvella以极其优越的方式击败我 - 拥抱您的环境为您提供的工具。在这种情况下,一个工具进行字符串搜索并替换并向其提供文件。

答案 3 :(得分:-1)

我知道的答案很晚,但我不认为目前的任何答案都解决了OP试图完成的事情,尽管zxcdw非常接近。

所有7岁的孩子都需要将程序加载到十六进制编辑器中并点击CTRL-S。如果文本位于可执行代码(或附近)或应用程序资源中,则可以找到并编辑它。

如果您想阻止 general public更改资源或静态数据只需对其进行加密,请将其填入资源中,然后在运行时对其进行解密。尝试使用DES来处理小事。