【问题标题】:Initialize a global integer array with a monotonic sequence at compile time?在编译时用单调序列初始化全局整数数组?
【发布时间】:2015-08-08 00:11:49
【问题描述】:

我想定义一个结构数组,我想它的第一个元素是这个元素在数组中的偏移量。它必须在编译时完成。我可以自动生成作为一种选择。我想知道是否有更简单的方法?

my_array[] = { {0, ...}, {1, ...}, ... }

我有一些#ifdefs 从初始化中删除了一些项目。因此,如果可能的话,我想忽略它们,因此重新调整了偏移量。

【问题讨论】:

  • 我把它改成了偏移量。这是 c 而不是 c++
  • gcc 允许以__attribute__((constructor)) 作为扩展的函数。它们在main()之前被调用,允许你有效地任意初始化全局对象。
  • @Olaf:我已经看到当结构最终被视为链表并且您需要能够映射回包含元素的数组时使用的那种数字(偏移量)不知道数组起始地址的链表。这是一个奇怪的边缘案例类型的情况,而不是主线编码,但它偶尔会有所帮助。 (它通常也可以通过其他方式解决,但这本身并不是想要避免它的充分理由。)至于主要问题,我不相信有比代码生成或运行更好的选择 -时间修正。
  • 如果使用gcc,你可能会想到__COUNTER__宏和递归#includes。但这将极大地限制元素的数量。生成代码可能是更简单的方法。

标签: c arrays embedded


【解决方案1】:

唯一的“标准”解决方案(非常肮脏!)是 __LINE__ 宏。假设您的记录由以下结构表示:

struct x { int v; };

1) 定义一个扩展为一个元素初始化器的宏:

#define ELEM { __LINE__ - 1 }

2) 创建一个包含元素初始化器列表的文件(即“elem.c”),每行一个,通过 ELEM 宏表示:

文件“elem.c”:

ELEM,
ELEM,
ELEM,
...

3) 如下定义你的数组:

struct x my_array[] = {
#include "elem.c"
};

显然,这是一个非常不方便的解决方案,因此我建议您改为编写一个简单的源代码生成器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多