问题应该说明一切。
假设有一个与主项目分离的本地文件“mydefaultvalues.txt”。在主项目中我想要这样的东西:
char * defaultvalues = " ... "; // here should be the contents of mydefaultvalues.txt
并让编译器将
" ... "
与 mydefaultvalues.txt
的实际内容交换。这可以做到吗?有编译器指令之类的吗?
不完全是,但你可以这样做:
默认.h:
#define DEFAULT_VALUES "something something something"
代码.c:
#include "defaults.h"
char *defaultvalues = DEFAULT_VALUES;
可以生成defaults.h,或者以其他方式创建defaults.h,无论您计划如何执行。 预处理器只能做这么多。 以它能够理解的形式制作文件将使事情变得更加容易。
我在 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
不是以 null 结尾的,因此不被视为 C 字符串。但既然你也有尺寸,这应该不是问题。
编辑:
一个小的变化将允许我有一个以空结尾的字符串:
echo "char defaultvalues[] = { " `xxd -i < defaultvalues.txt` ", 0x00 };" > defaultvalues.h
如果文件中存在空字符,显然不会很好地工作
defaultvalues.txt
,但如果它是纯文本,则不会发生这种情况。
实现此类编译时欺骗的一种方法是用某种解释性编程语言(例如 Python、Ruby 或 Perl 就可以)编写一个简单的脚本,该脚本执行简单的搜索和替换。然后在编译之前运行脚本即可。
定义您自己的 #pramga XYZ 指令,脚本会查找该指令并将其替换为声明带有字符串中的文件内容的变量的代码。
char * defaultvalues = ...
其中...包含从给定文本文件读取的文本字符串。请务必补偿行长度、换行符、字符串格式字符和其他特殊字符。
编辑:lvella 以远远优于我的方法击败了我 - 拥抱您的环境为您提供的工具。在本例中,这是一个进行字符串搜索、替换并向其提供文件的工具。
我知道迟到的答案,但我认为当前的任何答案都没有解决OP试图实现的目标,尽管zxcdw非常接近。
任何 7 岁的孩子所要做的就是将程序加载到十六进制编辑器中并按 CTRL-S。如果文本位于您的可执行代码(或附近)或应用程序资源中,他们可以找到它并进行编辑。
如果您想阻止general公众更改资源或静态数据,只需将其加密,将其填充到资源中,然后在运行时解密即可。从一些小事情开始尝试 DES。