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 回复学习与思考_昱: 嗯嗯
一年多之前 回复
qq_37535029
qq_37535029 嗯嗯
一年多之前 回复
a29562268
a29562268 回复学习与思考_昱: 容器里的类型设置为结构体指针类型
一年多之前 回复
sinat_33724606
sinat_33724606 只能得到指针和宏定义,接收的都不是数据啊,因为struct并不允许通过首地址的偏移来获取成员变量的信息。stl容器的使用是有条件的。
一年多之前 回复
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 你能不能写个最简单的例子,我参考下
一年多之前 回复
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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言中怎么将变量名转换为字符串 -转
比如我要做一个宏定义 #define name_to_str(name) 这个宏定义最终返回的是我要的字符串 用这个样子的定义可以解决你的问题: #define name_to_str(name_31415926)  (#name_31415926) 示例: #include #define name_to_str(name_31415926)  (#name_314
字符串转化为变量名的两种方法
例如下面有一个字符串常量的定义类ConstString Public class ConstString{    private static String constString_1 = "aaaa";    private static String constString_2 = "bbbb";    private static String constString_3 = "cc
关于C++ 里struct 和 class的区别
在分析android EventHub类时发现内嵌入一个Device结构体,在使用上和class类似。 虽然之前认为struct和class类似,但是不知道能当成class一样使用,哎,C++ 语言基础的东西都不会。 下面这篇博文写得不错。 博客原文地址:http://blog.sina.com.cn/s/blog_673ab5410100zzlf.html 有很多人在学习C++的时候只是
c++中有struct为什么还要引入class,c中的struct和c++中的struct的区别
http://zhidao.baidu.com/link?url=8ZGLAwfPbKhObii9JWSOn95Je8vFyl_wiDCEYiO3RJ9_pPXbGbs3mrbetpB1uQtNh9QKJh2BXqcuh9t7tgJy1a c++是在c语言的基础上,进行了很多功能扩展,其中最重要的一条,就是引入了class。引入class的最大好处就是,使c++可以进行面向对象编程。 面向
PHP 自定义字符串中的变量名解析
这样一个需求:页面的 title 可以在后台自定义,自定义内容中可能包含变量,变量用 {$var} 表示, 其中 $var 为变量名 将 title 字段存入数据库中,再提出来之后,用php自己的变量名解析就不管用了,会直接输出 {$var} ,不会像在定义字符串的时候,用双引号时就会自动把 {$var} 变换成相应的变量内容,这里就像是用单引号定义的字符串,所以需要自己解析。 这里的思路是用
C语言中 struct成员变量顺序对内存的占用
在C语言的结构体中,是会按照其变量类型来进行分配内存大小的。但是对于不同的编译器,结果是i不同的,在VC++6.0中是怎么个分配情况呢?用一下C中的关键字sizeof()来测试下,注意sizeof()不是函数哦!只是关键字而已。下图就是在VC++6.0中的字节分配情况: 下面来分析一下,C中结构体中成员变量的写法,对占用内存的影响。 却发现结构不是13个字节?却是24个字节?为
字符串中的所有单词进行倒排
题目描述 对字符串中的所有单词进行倒排。 说明: 1、每个单词是以26个大写或小写英文字母构成; 2、非构成单词的字符均视为单词间隔符; 3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符; 4、每个单词最长20个字母; 输入描述: 输入一行以空格来分隔的句子 输出描述:
C语言变量名转字符串的方法
C语言中将变量名转换成字符串使用的是#符号,来看下边两个宏定义: #define name2str(name) (#name) #define print_val(x) printf(#x" = %d\n", x)
C++中class与struct的区别(struct的类型名同时可以作为变量名)
原文地址:http://www.cnblogs.com/albert1017/p/3897739.html 通常我们知道的区别: (一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理; (二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。
matlab中利用eval和num2str实现struct变量名的递增
s = struct('strings',{{'hello','yes'}},'lengths',[5 3]) for n = 1:N eval(['EEG_',num2str(n),'=','s']); end