要做一个函数,把传来的结构体的变量名及变量值全部打印出来,共有几百个结构体,
函数调用时,对方只传过来一个结构体指针,和这个结构体对应的宏声明。
如果根据各个结构体挨个变量打印,太麻烦,有什么高效的方法?
这个只能一一对应了,不然谁知道都什么变量名哪??推荐使用Switch来做。。。
可以用工厂模式,根据结构体的宏声明生成对应的输出函数
#include <iostream>
#define VNAME(name) (#name)
int main()
{
int tmp = 100;
std::cout << VNAME(tmp) << ": " << tmp << std::endl;
return 0;
}
我们要看struct是否有能够支持通过首地址偏移访问其内部成员的技术存在
首先,深入理解struct,见博文:深入理解struct,以及博文:成员偏移量获取结构首地址,struct是不允许指针偏移访问的。
这个问题的核心应该是struct遍历的问题,见问答帖,大家认为这个事情不适合C++做,要不就让设计struct的人自己在struct内部设计一个输出sturct信息的函数。
思想。struct或class都是面向对象,其思想就是封装,封装意味着活是自己干,而不是等着另一个人干。
结论:
个人认为,只有通过指针来遍历struct成员从而打印变量和值,C++是办不到的。
你用stl容器吧,没收到一次数据,保存一次,比如向量
c++ 没有这种功能,
要实现这种功能 类和结构体的命名要用特殊的宏处理,普通定义的class struct不行
并且只能在预编译阶段做处理实现,
<<要做一个函数,把传来的结构体的变量名及变量值全部打印出来,共有几百个结构体,
<<函数调用时,对方只传过来一个结构体指针,和这个结构体对应的宏声明。
<<如果根据各个结构体挨个变量打印,太麻烦,有什么高效的方法?
1 你已经知道了按照类型打印,特别麻烦。
2 那么还有一种方法,可能比这个更麻烦,就是给每个结构体的第一个成员变量是一个类型。
3 生成一个vector string 是成员变量的名称,int是变量的长度。再生成一个 map string>
4 map 中存的是 类型,对应的结构体的属性(名称,长度,位置都是按照从0到大顺序的)
5 解析结构体生成代码(生成 map )
6 当接收到指针后,查看对应的type ,从map中查找对应type对应的vector,按照偏移获取变量的值。
这个方法是做通用工具的一个方式,就是要进行语法分析和词法分析c++ ,生成代码,再将生成代码和你自己的代码进行编译。
缺点是太复杂;优点是很有挑战性,而且的确非常通用。
你能不能写个最简单的例子,我参考下
你可以在编译器预处理前加上自己的预处理吧,根据struc或class 关键字,利用正则表达式,区分函数式和变量式。
,不过这和c++语言本身没关系啊。
#var 这样可以试一下
要是能转成python ,应该可以实现这样的功能