2 oqqsoap1234567 oqqsoap1234567 于 2017.01.11 14:59 提问

C++怎么样把struct或class里的所有变量名存储到字符串里 50C

要做一个函数,把传来的结构体的变量名及变量值全部打印出来,共有几百个结构体,
函数调用时,对方只传过来一个结构体指针,和这个结构体对应的宏声明。
如果根据各个结构体挨个变量打印,太麻烦,有什么高效的方法?

10个回答

sinat_26143945
sinat_26143945   2017.01.14 09:23

c++ 没有这种功能,
要实现这种功能 类和结构体的命名要用特殊的宏处理,普通定义的class struct不行
并且只能在预编译阶段做处理实现,

sinat_33724606
sinat_33724606   2017.01.11 23:15
  1. 首先,这里是打印一个的简单宏定义如下:
#include <iostream>
#define VNAME(name) (#name)

int main()
{
    int tmp = 100;
    std::cout << VNAME(tmp) << ": " << tmp << std::endl;
    return 0;
}
  1. 我们要看struct是否有能够支持通过首地址偏移访问其内部成员的技术存在
    首先,深入理解struct,见博文:深入理解struct,以及博文:成员偏移量获取结构首地址,struct是不允许指针偏移访问的。

  2. 这个问题的核心应该是struct遍历的问题,见问答帖,大家认为这个事情不适合C++做,要不就让设计struct的人自己在struct内部设计一个输出sturct信息的函数。

  3. 思想。struct或class都是面向对象,其思想就是封装,封装意味着活是自己干,而不是等着另一个人干。

结论:

个人认为,只有通过指针来遍历struct成员从而打印变量和值,C++是办不到的。

shen_wei
shen_wei   Ds   Rxr 2017.01.11 16:46

这个只能一一对应了,不然谁知道都什么变量名哪??推荐使用Switch来做。。。

welan123123
welan123123   2017.01.11 17:20

可以用工厂模式,根据结构体的宏声明生成对应的输出函数

a29562268
a29562268   2017.01.12 08:22

你用stl容器吧,没收到一次数据,保存一次,比如向量

qq_37535029
qq_37535029 回复学习与思考_昱: 嗯嗯
10 个月之前 回复
qq_37535029
qq_37535029 嗯嗯
10 个月之前 回复
a29562268
a29562268 回复学习与思考_昱: 容器里的类型设置为结构体指针类型
11 个月之前 回复
sinat_33724606
sinat_33724606 只能得到指针和宏定义,接收的都不是数据啊,因为struct并不允许通过首地址的偏移来获取成员变量的信息。stl容器的使用是有条件的。
11 个月之前 回复
justin_bkdrong
justin_bkdrong   2017.01.15 16:59

<<要做一个函数,把传来的结构体的变量名及变量值全部打印出来,共有几百个结构体,
<<函数调用时,对方只传过来一个结构体指针,和这个结构体对应的宏声明。
<<如果根据各个结构体挨个变量打印,太麻烦,有什么高效的方法?
1 你已经知道了按照类型打印,特别麻烦。
2 那么还有一种方法,可能比这个更麻烦,就是给每个结构体的第一个成员变量是一个类型。
3 生成一个vector string 是成员变量的名称,int是变量的长度。再生成一个 map string>
4 map 中存的是 类型,对应的结构体的属性(名称,长度,位置都是按照从0到大顺序的)
5 解析结构体生成代码(生成 map )
6 当接收到指针后,查看对应的type ,从map中查找对应type对应的vector,按照偏移获取变量的值。

这个方法是做通用工具的一个方式,就是要进行语法分析和词法分析c++ ,生成代码,再将生成代码和你自己的代码进行编译。
缺点是太复杂;优点是很有挑战性,而且的确非常通用。

oqqsoap1234567
oqqsoap1234567 你能不能写个最简单的例子,我参考下
11 个月之前 回复
oqqsoap1234567
oqqsoap1234567   2017.01.16 20:43

你能不能写个最简单的例子,我参考下

challno
challno   2017.01.20 15:26

你可以在编译器预处理前加上自己的预处理吧,根据struc或class 关键字,利用正则表达式,区分函数式和变量式。
,不过这和c++语言本身没关系啊。

hujunfeng424
hujunfeng424   2017.02.04 14:18

#var 这样可以试一下

a991556
a991556   2017.06.21 17:42

要是能转成python ,应该可以实现这样的功能

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!