标题:有没有能自动获取结构体成员数量的方法?~~~~
只看楼主
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用九转星河在2017-5-18 14:48:31的发言:

有啦~要突破常规方法~~可以把代码本身写入一个临时文件~然后通过读取文件字符数据来判断结构体成员数量~~~~虽然这样实现难度较高~不过还是感觉有可能实现的~

能具体演示一下?
文件通常以字节为单位,通常一个字节也可以表达多个结构体成员。
2017-05-18 15:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用吹水佬在2017-5-18 10:51:08的发言:

获得成员数量,应是为了遍历结构成员。
通用链表,就要自己去解释不同链表的数据结构,这方面工作编译器应该是帮不了。
编译器只会将合法的变量名用符号表示并放到“符号表”中,每个符号对应一个地址。当调用此变量时,在符号表找对应的地址进行操作。
简单的可试试用宏,宏也算是一种解释执行吧。

我觉得“链表”应该是这么使用

#define LIST_NODE_TYPE int
#include "your_list.h"

typedef struct foo
{
    int a;
    double b;
} foo;
#define LIST_NODE_TYPE foo
#include "your_list.h"

int main( void )
{
    your_list_int a;
    a.push_back( 1 );
    a.push_back( 2 );
    int tmp = a.back();

    your_list_foo b;
    b.push_back( foo{1,1.1} );
    b.push_back( foo{2,2.2} );
    foo temp = b.back();
}

作为链表实现者,应该完全不用关心node类型是什么,一切都交给编译器。
2017-05-18 15:17
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 11楼 吹水佬
这个我还是想想算了~毕竟就算万一实现了意义也不是很大~现阶段还是别往这方向去弄了~毕竟还有很多东西要学~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-18 20:51
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
得分:20 
这个其实并不复杂,将结构保存在语法树中遍历即可
2017-05-18 21:38
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
我惊呆了~~~~



原来这样都行~看来这个还是有希望实现的~~~~~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-18 22:00
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
得分:0 
程序代码:
#include <stdio.h>

int main()
{
    printf("\
    #include <stdio.h>\n\
    int main()\n\
    {\n\
        printf(\"%%s\\n\", \"test\");\n\
        return 0;\n\
    }\n");
            return 0;

}
2017-05-18 22:09
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
不过这个还有一个棘手的技术难题~就是如果结构体声明不在当前文件~并且出现重名用#ifndef #define的情况~那就要判断其到底是属于哪个结构体~~这样就要模仿编译器行为才能解决~~所以还是先放一下吧~~

PS明白了~编译器把变量名转化为地址以及对宏的处理的是在预编译的时候进行的~

[此贴子已经被作者于2017-5-19 11:43编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-18 23:57
鱼儿海
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:77
专家分:194
注 册:2013-8-14
得分:20 
我来领分
2017-05-19 11:20
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 17楼 九转星河
突然明白了~编译器本来就没有结构体成员数量这个概念~变量名都在预编译的时候转化为地址了~而地址的值可以是连续的~也就是说每一个字节的数据都可以修改~只是改了不敢保证会出问题一样~所以试图通过地址来获取变量名原理上是行不通的~因为编译器在编译的时候接收到的指令~只是保留了执行代码块的地址而变量名在预编译的时候就进行替换了~~虽然试图通过搜索地址来获取变量名这种方法原理上行不通~但是却加深了我对编译器的理解~~

[此贴子已经被作者于2017-5-19 12:00编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-19 11:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-477082-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.733974 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved