c - 用重复数据初始化 C 数组

标签 c arrays linker memory-management

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

struct st ar[] = { {1,2}, {1,2}, {1,2} };

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

当将数组用作迷你临时数据库(将 id 映射到结构)以及希望对所有数据库值使用默认值时,这是有道理的。

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

#define I {1,2}
struct st ar[SIZE_OF_ARRAY] = { I,I,I };

如果我的 I 太多或太少,编译器会警告我。但这远非理想。

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

我想我会以某种方式能够递归地定义一个宏,这样 I(27) 就会被解析为 27 个 {1,2},但是我不要认为这是可能的。但也许我弄错了,有什么破解方法吗?

也许内联汇编可以解决问题?用 MASM 或 TASM 定义这样的内存布局会很容易,但我不确定是否可以在 C 代码中嵌入内存布局指令。

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

附言 我知道我可以用一些脚本自动生成 C 文件。使用自定义脚本是不可取的。如果我使用自定义脚本,我将发明一个 C 宏 REP(count,exp,sep) 并编写一个迷你 C 预处理器以将其替换为 exp sep exp sep ... exp {exp 出现计数时间}.

最佳答案

boost preprocessor library (对 C 来说效果很好)可能会有所帮助。

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

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

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

#undef VALUE

如果您想使用它,您只需要来自 boost 的 boost/preprocessor 目录 - 它是完全独立的。

尽管如此,它确实对元素的数量有一些任意限制(我认为在这种情况下是 256 次重复)。有一个名为 chaos 的替代方案这不是,但它是实验性的,并且只适用于精确遵循标准的预处理器(GCC 的)。

关于c - 用重复数据初始化 C 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/844935/

相关文章:

Boost:bjam 如何构造库名?

c++ - 如果我在使用 PTHREAD_PROCESS_SHARED 时不调用 pthread_mutex_destroy 会发生什么

c - 尝试在 Apache [Cloud9IDE] 上打开文件时在 header 之前结束脚本输出

php - 在 PHP 中用其他文本包围字符串的某种方法?

javascript - 在 node.js 中一次遍历 50 个项目 block 中的数组

c++ - eclipse /海湾合作委员会 : Undefined Reference to Extern Variable

c - Arduino编译器在C库中找不到已实现的方法

c - 在更新顶级变量时使用堆栈错误中缀到后缀

javascript - 解析数组并将值转换为对象

模板化虚方法的 C++ 链接器错误