初始化具有重复数据的C数组

Ela*_*ich 5 c arrays linker memory-management

我想初始化一个结构数组,重复使用相同的元素,即

struct st ar[] = { {1,2}, {1,2}, {1,2} };
Run Code Online (Sandbox Code Playgroud)

但是我不想为此运行任何代码,我希望程序执行时内存的布局就像这样,不需要任何CPU指令(它会增加非常慢的CPU和相对较大的数组的启动时间).

当将数组用作迷你ad-hoc数据库(将id映射到struct)并且希望对所有数据库值使用默认值时,这是有意义的.

我最好的解决方案是使用某种形式

#define I {1,2}
struct st ar[SIZE_OF_ARRAY] = { I,I,I };
Run Code Online (Sandbox Code Playgroud)

因此,如果我有太多或太少的Is ,编译器会警告我.但这远非理想.

我认为在ANSI-C中没有解决方案,但我认为可能有宏观滥用或gcc扩展可以完成这项工作.理想情况下,我想要一个标准的解决方案,但即使编译器特定的解决方案也足够了

我以为我会以某种方式能够递归地定义一个宏,以便I(27)解决到27 {1,2}秒,但我不认为这是可能的.但也许我错了,是否有任何黑客攻击?

也许inline assemby可以解决这个问题?使用MASM或TASM定义这样的内存布局非常容易,但我不确定是否可以在C代码中嵌入内存布局指令.

是否有任何链接器技巧会引诱它根据我的命令初始化内存?

PS我知道我可以用一些脚本自动生成C文件.不希望使用自定义脚本.如果我使用自定义脚本,我将发明一个C-macro REP(count,exp,sep)并编写一个mini-C-preprocessor来替换它exp sep exp sep ... exp {exp appears count time}.

Dan*_*mes 10

升压预处理器库(这对于C正常工作)可能会有帮助.

#include <boost/preprocessor/repetition/enum.hpp>

#define VALUE(z, n, text) {1,2}

struct st ar[] = {
    BOOST_PP_ENUM(27, VALUE, _)
};

#undef VALUE
Run Code Online (Sandbox Code Playgroud)

如果你想使用它,你只需要boost/preprocessor来自boost 的目录 - 它完全是自包含的.

虽然,它确实对元素的数量有一些任意的限制(我认为在这种情况下它重复256次).有一种叫做混乱的替代方法,但它只是实验性的,只适用于精确遵循标准的预处理器(GCC的确如此).


Gre*_*ill 5

我能想到的最简单的方法是编写一个脚本来生成可以包含在C代码中的初始化程序:

{1,2},
{1,2},
{1,2}
Run Code Online (Sandbox Code Playgroud)

然后在你的来源:

struct st ar[] = {
    #include "init.inc"
};
Run Code Online (Sandbox Code Playgroud)

Makefile如果您愿意,可以安排自动生成.