首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C语言中的反射支持

C语言中的反射支持
EN

Stack Overflow用户
提问于 2009-08-30 03:47:16
回答 4查看 24.3K关注 0票数 35

我知道它不受支持,但我想知道是否有什么技巧可以绕过它。有什么建议吗?

EN

回答 4

Stack Overflow用户

发布于 2015-08-10 04:04:53

小贴士和窍门总是存在的。看看Metaresc库https://github.com/alexanderchuranov/Metaresc

它为类型声明提供了接口,该接口也将为类型生成元数据。基于元数据,您可以轻松地序列化/反序列化任何复杂性的对象。开箱即用,您可以序列化/反序列化XML、JSON、XDR、类似Lisp的表示法、C-init表示法。

下面是一个简单的例子:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "metaresc.h"

TYPEDEF_STRUCT (point_t,
                double x,
                double y
                );

int main (int argc, char * argv[])
{
  point_t point = {
    .x = M_PI,
    .y = M_E,
  };
  char * str = MR_SAVE_XML (point_t, &point);
  if (str)
    {
      printf ("%s\n", str);
      free (str);
    }
  return (EXIT_SUCCESS);
}

此程序将输出

$ ./point
<?xml version="1.0"?>
<point>
  <x>3.1415926535897931</x>
  <y>2.7182818284590451</y>
</point>

对于最新的gcc和clang来说,这个库在Linux、MacOs、FreeBSD和Windows上都能正常工作。自定义宏语言是其中一个选项。用户可以像往常一样进行声明,并从DWARF调试信息生成类型描述符。这将复杂性转移到构建过程中,但使采用变得容易得多。

票数 10
EN

Stack Overflow用户

发布于 2009-08-30 03:51:28

根据对How can I add reflection to a C++ application? (Stack Overflow)的响应,以及C++被认为是C的“超集”的事实,我想说你走运了。

关于why C++ doesn't have reflection (Stack Overflow)也有一个很好的长篇答案。

票数 5
EN

Stack Overflow用户

发布于 2009-08-30 03:59:17

你需要从头开始实现它。在纯C语言中,没有任何关于结构和复合类型的运行时信息。元数据根本不存在于标准中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1353022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档