0

问题应该说明一切。

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

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

并让编译器" ... "mydefaultvalues.txt. 这可以做到吗?有没有编译器指令之类的?

4

4 回答 4

4

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

默认值.h:

#define DEFAULT_VALUES "something something something"

代码.c:

#include "defaults.h"

char *defaultvalues = DEFAULT_VALUES;

可以在哪里生成 defaults.h,或者以其他方式创建,但是您打算这样做。预处理器只能做这么多。以它可以理解的形式制作文件将使事情变得容易得多。

于 2012-06-19T02:04:34.537 回答
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,但如果它是纯文本,则不会发生这种情况。

于 2012-06-19T02:15:27.397 回答
2

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

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

char * defaultvalues = ...

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

编辑:lvella 以非常出色的方法击败了我——拥抱你的环境为你提供的工具。在这种情况下,一个工具可以进行字符串搜索和替换并将文件提供给它。

于 2012-06-19T02:15:57.867 回答
-1

我知道迟到的答案,但我认为当前的任何答案都没有解决 OP 试图完成的任务,尽管 zxcdw 非常接近。

任何 7 岁的孩子所要做的就是将您的程序加载到十六进制编辑器中,然后按 CTRL-S。如果文本在您的可执行代码(或附近)或应用程序资源中,他们可以找到并编辑它。

如果您想防止公众更改资源或静态数据,只需对其进行加密,将其填充到资源中,然后在运行时对其进行解密。尝试 DES 做一些小事。

于 2012-06-19T04:54:24.013 回答