我在名为x
的结构中有两个名为y
和mystruct
的变量,当我有程序时,我希望能够像这样显示变量名称及其值。
mystruct.x --> 3, mystruct.y --> 5
有没有办法做到这一点,而不只是将mystruct.x
像c中的字符串一样放在printf中?
答案 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>