【问题标题】:how to display the name of a struct variable in c? [duplicate]如何在c中显示结构变量的名称? [复制]
【发布时间】:2015-04-18 09:28:30
【问题描述】:

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

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

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

【问题讨论】:

  • 除非你存储/建模一些关于你的结构的元数据。 c 不做反射..
  • 这是否意味着我需要这样的char *strings[]{variabilename,variabilename2}
  • 请参阅我提供的答案中的第二个食谱。还有其他类似的解决方案,但通常它们看起来很丑。
  • @user3159253 我找不到你的遮阳篷。你改名字了吗?
  • @CoderGuy user3159253 表示他们提供的链接中的第二个答案。为了给你一个直接的链接,这个:stackoverflow.com/a/7675661/1180785(我同意这似乎是你最好的选择,但实际上这是要避免的,因为它混淆了一切)

标签: c


【解决方案1】:

你不能以一种聪明而干净的方式提取结构的名称。 调用变量或结构的类型的可能性称为“反射” - 应用程序能够反射自身(在编译或运行时)并提取类型、类型名、内部变量等数据。

这在 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);
}

当然,这不是一个完整的例子。您确实想使用链表而不是临时有界数组,做更多的保护以防止溢出和数组外错误等。这只是想法。

作为旁注(我可能会因此而被否决),作为 C++ 开发人员,您的问题可以通过使用 typeid(x).name() 在 C++ 中更容易地解决(如果实现确实返回正常字符串,如 VC++ 实现) ,或使用 std::map 和 std::string 重现上述解决方案。但这只是一个旁注。

【讨论】:

  • 将此方法与基于您的应用程序建模为每种可能的类型(即 typename )生成访问器/打印机相结合实际上会提供(非常昂贵)但实际的反射实现
  • 就像 C 语言中的一切一样——一切皆有可能,您只需要编写大量代码。
  • 是的,几乎回答了这个问题;)
【解决方案2】:

你的意思是这样的吗: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-->10
stud1.x-->200 stud1.y-->300
stud2.x-->400 stud2.y-->500

【讨论】:

  • 该方法需要一个单独的函数(或宏)用于反射功能的每一位。这有什么帮助?
  • @amdixon 这可能有助于使代码更具可读性。
  • 同意它使代码更具可读性,问题是它不是通用 c 变量上类似反射功能的解决方案
  • 问题是如何在输出中显示变量名(用于调试问题),我修改了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
相关资源
最近更新 更多