例如,在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中完成吗?更具体地说,我只对论点的名称感兴趣,我并不特别关心它们的类型。
答案 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”函数(通过串联预处理器运算符)。
但这肯定是丑陋的,容易出错并且很棘手(因为你不能直接在这样的函数定义中执行代码)。我会尽可能避免这种宏观魔法。