【问题标题】:Is introspection on a function's arguments in C possible?是否可以在 C 中对函数的参数进行自省?
【发布时间】:2013-05-24 06:35:03
【问题描述】:

例如,在 Python 中,我可以使用 inspect 中的 getargspec 通过以下方式访问函数的参数:

>>> def test(a,b,c):
...     return a*b*c
...
>>> getargspec(test)
ArgSpec(args=['a', 'b', 'c'], varargs=None, keywords=None, defaults=None)

这完全可以在 C 中实现吗?更具体地说,我只对参数的名称感兴趣,并不特别关心它们的类型。

【问题讨论】:

  • AFAIK C 不包含任何关于这类东西的运行时信息,所以没有。
  • C 不直接支持此功能。您也许可以找到一个试图将其破解为该语言的库,但它可能会非常丑陋。

标签: c function arguments introspection


【解决方案1】:

不,所有变量名在编译期间都消失了(可能具有“外部”存储持续时间的文件范围变量除外),因此您无法获取参数的声明名称。

【讨论】:

    【解决方案2】:

    该语言根本不包含任何内容。

    根据实现的不同,如果你非常想要这个,你可以得到它。为此,您通常必须在启用调试信息的情况下进行编译,并使用特定于编译器和平台的精确组合的代码来执行此操作。大多数编译器确实支持创建和访问包含函数参数名称的调试信息——但执行此操作的代码不可移植(而且在许多情况下,它也很丑陋)。

    【讨论】:

    • 我想它可以做到,但对我的口味来说,它会很乱。还是谢谢。
    【解决方案3】:

    不,这在 C 中是绝对不可能的,因为变量名只在编译时存在。

    也许它可以通过宏来解决。 你可以定义

    #define defFunc3(resultType,name,type0,arg0name,type1,arg1name,type2,arg2name) \
    ...store the variable names somehow... \
    ...you can access the variable name strings with the # operator, e.g. #arg0name \
    ...or build a function with concatenation: getargspec_##name \
    resultType name(type0 arg0name, type1 arg1name, type2 arg2name )
    

    然后用这个宏声明你的函数:

    defFunc3( float, test, float, a, float, b, float, c ) {
      return a * b * c;
    }
    

    在宏体中,您可以以某种方式将变量名称(使用字符串化预处理器运算符)和/或函数地址存储在某处,或者创建某种“getargspec”函数(通过串联预处理器运算符)。

    但这绝对是丑陋的、容易出错的和棘手的(因为你不能直接在这样的函数定义中执行代码)。我会尽可能避免这种宏观魔术。

    【讨论】:

    猜你喜欢
    • 2011-05-21
    • 1970-01-01
    • 2011-12-13
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多