【发布时间】:2018-12-19 08:34:20
【问题描述】:
我有一个结构,我正在使用预处理宏来填充结构中的数组。
#include <stdio.h>
void init_data();
typedef struct _abc{
int a[10][10];
int b[5][5];
}abc;
static abc q_abc[]= {
#define XYZ(x,y,z) [x]={.a[y][z]=1,.b[y][z]=1},
XYZ(1,2,3)
XYZ(1,3,2)
};
static abc q_abc1[5];
void init_data()
{
#define XYZW(x,y,z) q_abc1[x].a[y][z] =1;
XYZW(1,2,3)
XYZW(1,3,2)
}
int main()
{
printf("\n %d %d\n",q_abc[1].a[2][3]);
init_data();
printf("\n %d %d\n",q_abc1[1].a[2][3]);
return 0;
}
我正在使用宏初始化结构q_abc。但这里的问题是在宏调用XYZ(1,2,3) 期间设置的值在调用下一个宏调用XYZ(1,3,2) 期间重置为默认值0。我可以理解为不指定任何显式初始化程序会将数组设置为默认值 0。
为了避免这种情况,我使用了init_data 方法。这里我不是在初始化数组,而是在分配,因此数组将包含所有宏调用的所有值。但是这里的问题是,如果数据很大或宏调用的数量很大,则 func 调用将花费很少的时间来完成,这会增加我的 exe 运行时间的开销。
有没有办法在变量定义过程中实现init_data 的行为?有什么建议吗?
【问题讨论】:
-
我对在
{}中使用#define抱有迷信的怀疑态度。您将它们放在那里的预期效果是什么? -
转储
#define。把它写下来 - 让它一开始就可读。 -
我不太明白你在说什么,我的意图是把#define XYZ(x,y,z) .. 表示这个宏只是并且只用于初始化这个结构(在其中定义)并且我打算包含一个包含所有宏定义 X(1,2,3).. 的头文件,依此类推。这只是我打算在更大的工作项目中使用的概念。
-
@CodeTry:由于您提到“巨大的数组”,一种方法可能是编写一个脚本,该脚本将在构建期间为您生成具有适当数据的源(甚至是一次性调用)。这比手动编写数百个数字更有效,更不容易出错。
-
我同意,到目前为止,我所做的是编写一个 python 脚本来解析数据以转储到 Xmacro 格式的头文件 x(1,2,3,...) 。然后我试图在预处理期间加载我的数组。我只添加了一个示例代码来突出显示确切的问题,但是正如 StoryTeller 告诉我的那样,它对时间的影响并不大。
标签: c struct c-preprocessor