如何在c中显示struct变量的名称?

时间:2015-04-18 09:28:30

标签: c

我在名为x的结构中有两个名为ymystruct的变量,当我有程序时,我希望能够像这样显示变量名称及其值。

mystruct.x --> 3, mystruct.y --> 5

有没有办法做到这一点,而不只是将mystruct.x像c中的字符串一样放在printf中?

2 个答案:

答案 0 :(得分:2)

您无法以智能和干净的方式提取结构的名称。 调用变量或结构类型的可能性被称为"反射" - 应用程序能够反映自身(在编译或运行时)并提取类型,类型名称,内部变量等数据。

这在C中根本不受支持。在考虑它的情况下,C并不关心 - 结构基本上是内存中的一行(实际上与C中的任何其他变量一样)。

但是,您可以创建一个不太智能的实现,将类型名称存储在内存地址中:

struct memory_address_to_type_name{
  char type_name [20],
  void* memory_address
} name_memory_address_map[50];

char* get_name (void* variable){
  int i;
  for (i=0;i<50;i++){
    if (variable == name_memory_address_map[i].memory_address)){
      return name_memory_address_map[i].type_name;
    }
  }
   return "not found";
}


int push_name (void* variable , char* type_name){
  int i;
  for (i=0;i<50;i++){
    if (strcmp(name_memory_address_map[i].type_name,"") == 0){
      name_memory_address_map[i].memory_address = variable;
      strcpy(name_memory_address_map[i].type_name,type_name);
    }
    return 1;
  }
   return 0;
}

}

int main (void){
myStruct x;
push_name (&x,"myStruct");
//other code

printf("%s --> %d",get_name(x),x.my_member);
}

当然,这不是一个完整的例子。你确实想要使用链表而不是ad-hoc有界数组,做更多的防止溢出和数组错误等等。这只是想法。

作为旁注(我可能会为此投降),作为C ++开发人员,使用typeid(x).name()可以更容易地在C ++中解决问题(如果实现确实返回普通字符串,就像VC ++实现),或者使用std :: map和std :: string重现上面的解决方案。但这只是旁注。

答案 1 :(得分:1)

你的意思是这样的:http://ideone.com/3UeJHv

#include <stdio.h>
#define PRINT_INT(X) printf(#X"-->%d\n",X)
#define PRINT_STUDENT(X) printf(#X".x-->%d " #X".y-->%d\n" ,X.x ,X.y)

struct student
{
    int x;
    int y;
};
int main()
{

    int c = 10;
    PRINT_INT(c);
    struct student stud1 = {200 , 300};
    struct student stud2 = {400 , 500};
    PRINT_STUDENT(stud1);
    PRINT_STUDENT(stud2);
    return 0;
}

输出:

  

c - &gt; 10
stud1.x - &gt; 200 stud1.y - &gt; 300
stud2.x - &gt; 400 stud2.y - &gt; 500 < / p>