【发布时间】:2015-03-08 07:40:18
【问题描述】:
C 语言是否有允许运行时结构自省的工具?
上下文是这样的: 我有一个响应外部事件的守护进程,并且对于每个事件,我们都携带一个执行上下文结构(“上下文”)。上下文大而杂乱,包含对各种状态的引用。
处理完事件后,我希望能够通过过滤器运行上下文,如果它符合某些条件,则删除一条日志消息以帮助调试。但是,由于我希望将其用于现场调试,因此直到运行时我才知道过滤哪些标准是有用的。
我的理想解决方案本质上是允许用户编写 C 风格的布尔表达式并让程序使用它。比如:
activate_filter context.response_time > 4.2 && context.event.event_type == foo_event
到目前为止,被折腾的想法包括:
- 提供一组我们知道如何访问的有限字段。
- 将所有相关结构封装在某种宏中,在运行时生成自省工具。
- 编写一个知道(版本化的)头文件所在位置的 python 脚本,生成 C 代码并将其编译为 dll,然后守护程序将其加载并用作过滤器。显然,这种方法有一些额外的安全考虑。
在我开始疯狂的设计追逐之前,有没有人知道这种事情的例子?我做了一些谷歌搜索,但还没有想出太多。
【问题讨论】:
-
没有内置自省。您可以设计近似自省的系统(描述其他结构的静态定义结构),
<stddef.h>中的sizeof运算符和offsetof宏可以提供帮助。类型编码是一个完全独立的bag'o'worms。 -
可以进行自省using
_Generic,但这适用于编译时而不是运行时。
标签: c introspection