例如,在 Python 中,我可以使用getargspec
frominspect
以下列方式访问函数的参数:
>>> def test(a,b,c):
... return a*b*c
...
>>> getargspec(test)
ArgSpec(args=['a', 'b', 'c'], varargs=None, keywords=None, defaults=None)
这可能在C中完成吗?更具体地说,我只对参数的名称感兴趣,我并不特别关心它们的类型。
例如,在 Python 中,我可以使用getargspec
frominspect
以下列方式访问函数的参数:
>>> def test(a,b,c):
... return a*b*c
...
>>> getargspec(test)
ArgSpec(args=['a', 'b', 'c'], varargs=None, keywords=None, defaults=None)
这可能在C中完成吗?更具体地说,我只对参数的名称感兴趣,我并不特别关心它们的类型。
该语言根本不包括沿着这条线的任何东西。
根据实现的不同,如果你非常想要这个,你很有可能会得到它。为此,您通常必须在启用调试信息的情况下进行编译,并使用特定于编译器和平台的精确组合的代码来执行此操作。大多数编译器确实支持创建和访问包含函数参数名称的调试信息——但执行此操作的代码将不可移植(在许多情况下,它也会非常难看)。
不,所有变量名在编译期间都消失了(除了可能具有“extern”存储持续时间的文件范围变量),因此您无法获得参数的声明名称。
不,这在 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”函数(通过串联预处理器运算符)。
但这绝对是丑陋的、容易出错的和棘手的(因为你不能直接在这样的函数定义中执行代码)。我会尽可能避免这种宏观魔术。