1

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

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

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

4

3 回答 3

1

该语言根本不包括沿着这条线的任何东西。

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

于 2013-05-29T06:16:26.357 回答
0

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

于 2013-05-29T05:59:44.390 回答
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”函数(通过串联预处理器运算符)。

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

于 2013-05-29T06:55:14.137 回答