在c中为结构成员赋值而不使用成员名称?
我有一个结构,我想做的是使用for循环为其成员赋值。这样我就不用用会员的名字了。因为结构很长,我不想要20行在c中为结构成员赋值而不使用成员名称?,c,pointers,structure,pointer-to-member,C,Pointers,Structure,Pointer To Member,我有一个结构,我想做的是使用for循环为其成员赋值。这样我就不用用会员的名字了。因为结构很长,我不想要20行p\u struct->member\u name等。我目前拥有的内容如下,但我不确定我的方向是否正确。 在头文件中: typedef struct { int x; char ch; ... ... }data; data g_data; 在.c文件中 data *p_data; p_data = &(g_data.x) for(i=0 till struct_el
p\u struct->member\u name
等。我目前拥有的内容如下,但我不确定我的方向是否正确。在头文件中:
typedef struct {
int x;
char ch;
...
...
}data;
data g_data;
在.c文件中
data *p_data;
p_data = &(g_data.x)
for(i=0 till struct_elements) {
*p_data = (some value);
p_data++; //next member
}
您不是,p_data是指向数据的指针,p_data++将向上移动它的大小(data)字节,这不是下一个成员,而是在您的结构之外。此外,由于成员的类型不同,即使该问题已得到解决,该方法也无法工作。您不是,p_data是指向数据的指针,p_data++将其向上移动sizeof(data)字节,这不是下一个成员,而是在您的结构之外。此外,由于成员的类型不同,即使该问题已得到解决,该方法也不起作用。这不是有效的C。但有效的C是将每个成员的类型和偏移量制成常数表,并在循环中使用:
struct struct_def {
int typecode;
size_t offset;
};
static const struct struct_def mystruct_def[] = {
{ TYPE_INT, offsetof(struct mystruct, x) },
{ TYPE_CHAR, offsetof(struct mystruct, y) },
/* ... */
{ TYPE_NONE, 0 }
};
然后您可以访问成员x
作为*(int*)((char*)foo+mystruct_def[0].offset)
这只是一个例子;真实世界的使用可能会更复杂一些…这不是有效的C。但有效的C是制作每个成员的类型和偏移量的常量表,并在循环中使用:
struct struct_def {
int typecode;
size_t offset;
};
static const struct struct_def mystruct_def[] = {
{ TYPE_INT, offsetof(struct mystruct, x) },
{ TYPE_CHAR, offsetof(struct mystruct, y) },
/* ... */
{ TYPE_NONE, 0 }
};
然后您可以访问成员x
作为*(int*)((char*)foo+mystruct_def[0].offset)
这只是一个例子;现实世界的用法可能会更精细一些…… 如果它只是一个你正在试图解决的可读性问题,那么你应该考虑使用结构初始化器:
typedef struct { int a,b,c,d,e } data;
data g_data[10];
int i;
for (i=0;i<10;i++)
{
data t={i,i*2,i*3,i*4,i*5 }; /* non-constant initializers are supported with C99, C++, GNU-C or MSVC..*/
g_data[i]=t; /* the optimizer will turn this into direct stores.. */
}
typedef结构{inta,b,c,d,e}数据;
数据g_数据[10];
int i;
对于(i=0;i),如果它仅仅是一个可读性问题,你试图解决,那么你应该考虑使用结构初始化:
typedef struct { int a,b,c,d,e } data;
data g_data[10];
int i;
for (i=0;i<10;i++)
{
data t={i,i*2,i*3,i*4,i*5 }; /* non-constant initializers are supported with C99, C++, GNU-C or MSVC..*/
g_data[i]=t; /* the optimizer will turn this into direct stores.. */
}
typedef结构{inta,b,c,d,e}数据;
数据g_数据[10];
int i;
对于(i=0;如果我使用#pragma pack会有帮助吗?比20行p#u struct->member#u name更难看的是任何混淆代码的解决方案。如果初始化让你如此困扰,请将其包装在函数中。如果我使用#pragma pack会有帮助吗?比20行p#struct->member#u name更难看的是任何混淆代码的解决方案正在进行。如果初始化让您如此困扰,请将其包装在函数中。这是标准的C99,因此它现在几乎可以在任何地方工作(MSVC除外)。这是标准的C99,因此它现在几乎可以在任何地方工作(MSVC除外)。