C 如何基于传递的结构名称部分访问结构

C 如何基于传递的结构名称部分访问结构,c,struct,C,Struct,我有5个模式为“struct\u ID\u name”的结构,所有结构共享相同数量和类型的字段。 e、 g 当我传递字符ID[2]时,是否有方法编写函数,我可以访问该特定结构的变量? e、 g void foo(char*ID) { int i=struct_uuuname.field2; printf(“%d”,i); } 为了提供一些上下文,我有不同的记录,前两个字段是公共的。这两个字段告诉我记录的大小、记录的名称……每个记录类型中的字段数是不同的。每个记录的结构名都是struct_uun

我有5个模式为“
struct\u ID\u name
”的结构,所有结构共享相同数量和类型的字段。 e、 g

当我传递
字符ID[2]
时,是否有方法编写函数,我可以访问该特定结构的变量? e、 g

void foo(char*ID)
{
int i=struct_uuuname.field2;
printf(“%d”,i);
}
为了提供一些上下文,我有不同的记录,前两个字段是公共的。这两个字段告诉我记录的大小、记录的名称……每个记录类型中的字段数是不同的。每个记录的结构名都是struct_uuname模式,其中ID可以是任意两位数。我想检索公共字段

更多信息: 有一个程序正在解析文件中的记录

一个文件可以有50种类型的记录。 每个记录包含不同数量的字段

这50条记录中都有一些公共字段。 每个记录中的第一个字段告诉我记录的大小, 第二个字段告诉我一些记录的uniq键 第三个字段告诉我一些不同的情况

我需要解析结构/记录中的公共字段


因此,我想到了一些通用的方法来实现这一点,一旦我通过ID,我应该能够从记录中检索大小。

您的要求很奇怪,您可以这样做:

void foo(char * ID)
{
  if (strcmp(ID, "01"))
  {
    int i = struct_01_name.field2;
    printf("%d", i);
  }
  if (strcmp(ID, "02"))
  {
    int i = struct_02_name.field2;
    printf("%d", i);
  }
  else if (strcmp(ID, "03"))
  {
    int i = struct_03_name.field2;
    printf("%d", i);
  }

  ...

}
但我认为你的问题相当复杂。
您应该告诉我们更多关于您的用例的信息。

您的需求非常奇怪,您可以这样做:

void foo(char * ID)
{
  if (strcmp(ID, "01"))
  {
    int i = struct_01_name.field2;
    printf("%d", i);
  }
  if (strcmp(ID, "02"))
  {
    int i = struct_02_name.field2;
    printf("%d", i);
  }
  else if (strcmp(ID, "03"))
  {
    int i = struct_03_name.field2;
    printf("%d", i);
  }

  ...

}
但我认为你的问题相当复杂。
您应该告诉我们更多关于您的用例的信息。

您可以使用宏和
#
操作符

##
运算符用于串联

#include<stdio.h>



//The macro
#define X(num) \
    i=struct_##num##_name.field2; \
    printf("\nstruct_%s_name.field2 = %d", #num, i);



//The structures
struct struct_01
{
  char field1[25];
  int field2;
};
struct struct_01  struct_01_name;

struct struct_02
{
  char field1[25];
  int field2;
};
struct struct_02  struct_02_name;

//main() function
int main()
{
    int i;

    struct_01_name.field2=10;
    struct_02_name.field2=20;

    X(01)

    X(02)
}
即使您有50个这样的结构,您也可以使用它

台词:

X(01)

X(02)
将由预处理器替换,以提供:

i=struct_01_name.field2; \
printf("\nstruct_%s_name.field2 = %d", "01", i);

i=struct_02_name.field2; \
printf("\nstruct_%s_name.field2 = %d", "02", i);

您可以使用宏和
操作符

##
运算符用于串联

#include<stdio.h>



//The macro
#define X(num) \
    i=struct_##num##_name.field2; \
    printf("\nstruct_%s_name.field2 = %d", #num, i);



//The structures
struct struct_01
{
  char field1[25];
  int field2;
};
struct struct_01  struct_01_name;

struct struct_02
{
  char field1[25];
  int field2;
};
struct struct_02  struct_02_name;

//main() function
int main()
{
    int i;

    struct_01_name.field2=10;
    struct_02_name.field2=20;

    X(01)

    X(02)
}
即使您有50个这样的结构,您也可以使用它

台词:

X(01)

X(02)
将由预处理器替换,以提供:

i=struct_01_name.field2; \
printf("\nstruct_%s_name.field2 = %d", "01", i);

i=struct_02_name.field2; \
printf("\nstruct_%s_name.field2 = %d", "02", i);


为什么不使用一个结构而不是5个相同的结构呢?你不能这样做。但请告诉我们你为什么要这么做?你想解决的实际问题是什么?也许可以用其他方法解决?为了帮助你,我们需要上下文,这里你问了一个奇怪的问题。实际上,我有一些公共字段的不同结构,我想根据传递的ID检索公共字段。这是真实的情况。你可能应该使用工会?请添加更多上下文(您的结构的确切定义)并将其添加到问题中。为什么不使用一个结构而不是5个相同的结构?您不能这样做。但请告诉我们你为什么要这么做?你想解决的实际问题是什么?也许可以用其他方法解决?为了帮助你,我们需要上下文,这里你问了一个奇怪的问题。实际上,我有一些公共字段的不同结构,我想根据传递的ID检索公共字段。这是真实的情况。你可能应该使用工会?请添加更多的上下文(您的结构的精确定义)并将其添加到问题中。我认为这应该是一个解决办法,但如果没有变量,您无法直接访问结构
struct\u 01\u name
是结构的名称,而不是其变量。这个要求很模糊,我认为OP忽略了这一点fault@VidorVistrom你是对的,实际上问题还不清楚。谢谢Michael,让我们假设对象为struct_01_name和struct_02_name;如果我有50条记录,有没有一种更为通用的方法来实现这一点,而不是写50条案例陈述?@CppLearner没有,但你的方法似乎完全错误。你应该给我们一个更广阔的图景,让我们了解你真正想要实现的目标。你读过这个链接吗?@Michael Walz,是的,我读过这个链接。我还更新了这个问题。谢谢你的帮助。我认为这应该是一个解决办法,但是如果没有它的变量,你不能直接访问结构
struct\u 01\u name
是结构的名称,而不是其变量。这个要求很模糊,我认为OP忽略了这一点fault@VidorVistrom你是对的,实际上问题还不清楚。谢谢Michael,让我们假设对象为struct_01_name和struct_02_name;如果我有50条记录,有没有一种更为通用的方法来实现这一点,而不是写50条案例陈述?@CppLearner没有,但你的方法似乎完全错误。你应该给我们一个更广阔的图景,让我们了解你真正想要实现的目标。你读过这个链接吗?@Michael Walz,是的,我读过这个链接。我也更新了问题。谢谢你的帮助。谢谢你的投入和花时间回答。很抱歉延迟了响应,我有一段时间没有登录到该站点,宏是在代码之前处理的,我想将值传递给函数,我将在程序执行期间获得该值。再次感谢并投票表决。感谢您的投入并花时间回复。很抱歉延迟了响应,我有一段时间没有登录到该站点,宏是在代码之前处理的,我想将值传递给函数,我将在程序执行期间获得该值。再次感谢并投票表决。