是否可能对C中函数的参数进行内省?

时间:2013-05-29 05:54:40

标签: c function arguments introspection

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

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

这可能在C中完成吗?更具体地说,我只对论点的名称感兴趣,我并不特别关心它们的类型。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

不,这在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”函数(通过串联预处理器运算符)。

但这肯定是丑陋的,容易出错并且很棘手(因为你不能直接在这样的函数定义中执行代码)。我会尽可能避免这种宏观魔法。