C语言的高手请进----如何打印出数据结构的成员名称

zoboo 2009-07-01 12:34:27
如何打印出数据结构的成员变量名

例如:数据结构如下,
typedef struct{
int dsfsfdf;
int hgfhgf;
int jkjfgjgf;
}AAA;

如何在屏幕上打印出如下的字符串:
dsfsfdf = 7
hgfhgf = 3432
jkjfgjgf = 767

要求,不能使用“硬编码”。例如,如下语句中的【dsfsfdf = 】属于“硬编码”。
printf("dsfsfdf = %d", AAA.dsfsfdf);

再详细的描述下问题:
知道数据结构的名“AAA”,如何打印出他的数据成员名“dsfsfdf 、hgfhgf 、jkjfgjgf ”。
要求不能“硬编码”。

我的想法是 使用类似"__FUNC__"这样的预处理宏。或者库函数。
请各位高手指点。
...全文
3271 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuffonconnie 2011-11-05
  • 打赏
  • 举报
回复
我也想要这种反射功能。现在需要知道一个结构的成员到底是什么名字,什么类型的
leyuanhust 2011-05-12
  • 打赏
  • 举报
回复
这个问题也一直在考虑,就像gdb里p一个结构变量就能打出所有的成员变量名。现在我们接口里经常修改,添加或则删除了某个成员,所有的打印函数也得跟着修改,经常一个很大的工程,许多新手会遗漏修改。
yeatol 2009-07-08
  • 打赏
  • 举报
回复
把名字以字符串类型写在结构里呗。
forwrj 2009-07-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 brookmill 的回复:]
这样算不算“硬编码”?

C/C++ code#define _STR(x) #x
#define STR(x) _STR(x)

#define MEMBER1 dsfsfdf
#define MEMBER2 jkjfgjgf

typedef struct{
int MEMBER1;
int MEMBER2;
}AAA;

int main()
{
AAA a;
a.MEMBER1 = 123;
a.MEMBER2 = 456;
printf(STR(MEMBER1) " = %d \n", a.MEMBER1);
printf(STR(MEMBER2) " = %d \n", a.MEMBER2);
return 0;
}
[/Quote]

好像这和
要求,不能使用“硬编码”。例如,如下语句中的【dsfsfdf = 】属于“硬编码”。
没什么区别
把宏展开就是printf("dsfsfdf ")这好像合题意啊
为什么不 用:
printf("%s = %d \n",STR(MEMBER1),a.MEMBER1);
如:

#include "stdio.h"
#define Name val
#define str(n) #n
main()
{
int Name = 10;
printf("%s = %d",str(Name),Name);
}

xu044 2009-07-08
  • 打赏
  • 举报
回复
一楼的方法就不错,如果打印时格式可以都一样的话就直接#define printMem( mem ) printf( #mem " = %d ", mem ),
对于不同的类型可以多define几个,以后每次都用printMem( p->mem )就行了。
rsp19801226 2009-07-06
  • 打赏
  • 举报
回复
有个笨办法,就是写一个类函数,把所有定义过的结构名全部添加进去,这样就可以得到所有想得到的名字了
lingruoshui 2009-07-06
  • 打赏
  • 举报
回复
定义一个 宏,来的直接
ForestDB 2009-07-06
  • 打赏
  • 举报
回复
C语言不是Java,没有反射。
Wolf0403 2009-07-06
  • 打赏
  • 举报
回复
symbol names are lost upon compilation. jump out of the box of C language
zhangxfeng112 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhangxfeng112 的回复:]
引用 8 楼 zoboo 的回复:
回5楼的朋友
看这位老鸟是比较自负啊~,总是觉得别人不如你啊!



我没这个意思,只是就事论事,楼主在想办法实现一种没可能实现的功能,忠言逆耳。

除非你把成千上万的结构和参数写到文件里,想输出的时候去读文件。
[/Quote]

类似linux的ctag文件。
zhangxfeng112 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zoboo 的回复:]
回5楼的朋友
看这位老鸟是比较自负啊~,总是觉得别人不如你啊!
[/Quote]

我没这个意思,只是就事论事,楼主在想办法实现一种没可能实现的功能,忠言逆耳。

除非你把成千上万的结构和参数写到文件里,想输出的时候去读文件。
brookmill 2009-07-02
  • 打赏
  • 举报
回复
在1楼的基础上再加一个宏定义:
#define OUTPUT(stru, member) printf(STR(member) "=%d\n", stru.member)
……
OUTPUT(a, MEMBER1);
OUTPUT(a, MEMBER2);
zoboo 2009-07-01
  • 打赏
  • 举报
回复
感谢各位的回复。以下是我对每个朋友的回复

回1楼的朋友
感谢你的想法。这个想法我倒是没有考虑过。不管你的想法是否可行,但是增加的我的思考范围。先谢了,如果有了新的思路再回复你。

回2楼的朋友
●之所以提出这样的需求 是因为:我们要输出每个函数的参数。要求打印每个参数的数据成员名。而所有函数参数的成员加起来能有“上万个”。
如果这么多的参数都一条一条的打印,先不说工数,就是后期的评审、测试、维护都是麻烦的事情。以上就是提出这个需求的原因。
●我知道每个结构体成员名称编译后就已经不存在了,如果想在编译后的代码中得到结构体成员名称是不可能的。
其唯一的解决办法,就是在编译的时候入手,其思路我感觉应该和实现“__FUNC__”预定义宏的处理类似。
所以,我想问问这里的高人是否遇到过处理此内容的 预定义宏。

回3楼的朋友
现在看来,如果想软编码,有2种办法。
第一种,在编译的时候下手。(既:像3楼朋友说的写个编译器。或者像4楼朋友说的给编译器写个shell)。但是我在考虑是否有这样的编译参数能够方便我们实现,不写编译器的情况下,我们就能够达到目的呢?毕竟修改编译器事件麻烦的事情,还不如,直接写个文件解析的小程序,直接把定义数据结构的头文件解析后,把需要的数据成员名输出到指定的文件或者链表中。

第二种,手工把所有的数据结构的成员名,做成字符串的表。统一管理。这样后期的管理能省点事。但是,前期字符串的做成也不是件容易的事情啊!毕竟需要整理的结构体的数据成员有“上万个”呢!

回4楼的朋友
你的想法和我现在的想法基本一致。我的具体想法,请参见对3楼的回复。

回5楼的朋友
看这位老鸟是比较自负啊~,总是觉得别人不如你啊!

回6楼和7楼的朋友
请参见对1楼朋友的回复。

以上,感谢各位的积极参与!我对此问题的观点,请参见对3楼朋友的回复。


brookmill 2009-07-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhangxfeng112 的回复:]
这两个宏定义,除了多占2个代码行意外,我就看不出它还有什么意义,
难道 这个结果体会在几个地方重复定义? 又或者成员名称要经常变? 又或者几个结构体都要用一样的成员变量名?

越想越觉得混乱。。。
[/Quote]
确实没啥意义。我写这几行代码的时候也觉得很混乱。
这也是常有的事:老板提了个需求又不详细说明意图,我们只好胡乱揣摩了。
zhangxfeng112 2009-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 brookmill 的回复:]
这样算不算“硬编码”?


#define _STR(x) #x
#define STR(x) _STR(x)

#define MEMBER1 dsfsfdf
#define MEMBER2 jkjfgjgf

typedef struct{
int MEMBER1;
int MEMBER2;
}AAA;

[/Quote]

这两个宏定义,除了多占2个代码行意外,我就看不出它还有什么意义,
难道 这个结果体会在几个地方重复定义? 又或者成员名称要经常变? 又或者几个结构体都要用一样的成员变量名?

越想越觉得混乱。。。
zhangxfeng112 2009-07-01
  • 打赏
  • 举报
回复
2楼回答得很好。解释得比较透彻。
楼主会提出这样的问题,说明你对C\C++的掌握,现在还停留在表面,
根本不了解 它的一些功能特性 底层是怎么实现的。
继续努力加油吧,以后进步了,就不会再提这么幼稚的问题了。
HalfmanHuang 2009-07-01
  • 打赏
  • 举报
回复
不明白,结构的成员名是不是固定的啊?如果是固定的话自己另外做个字符串存储成员名不就得了。
如果不是固定的那就难了,我的想法是给编译器加个shell,从源码获取成员名保存在文件里,程序运行时再从文件获得成员名。
xxjjs 2009-07-01
  • 打赏
  • 举报
回复
晕!!

真要“软”编码, 看来只好自己写一个编译器鸟~~~
brookmill 2009-07-01
  • 打赏
  • 举报
回复
我已经有好几次见到有人问这个问题了,有点好奇,为什么有这种需求。
如果只是为了维护方便,那么1楼的那种作弊行为已经多少达到目的了,想修改成员名称的时候修改一处即可。
其它的更好的办法,我想不到也没见过。

使用库函数是不可能的。编译之后,所有的成员变量名都已经变成地址偏移量了,运行时无法得到成员名称。
所以只能在编译的过程来想办法。不过类似"__FUNC__ "那样的宏,我没听说有哪个是用于这个目的。
brookmill 2009-07-01
  • 打赏
  • 举报
回复
这样算不算“硬编码”?
#define _STR(x) #x
#define STR(x) _STR(x)

#define MEMBER1 dsfsfdf
#define MEMBER2 jkjfgjgf

typedef struct{
int MEMBER1;
int MEMBER2;
}AAA;

int main()
{
AAA a;
a.MEMBER1 = 123;
a.MEMBER2 = 456;
printf(STR(MEMBER1) " = %d \n", a.MEMBER1);
printf(STR(MEMBER2) " = %d \n", a.MEMBER2);
return 0;
}

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧