在编译时选择/发现外部函数调用的签名

时间:2012-04-11 21:11:01

标签: c linker extern

我在外部库中调用一个函数,该函数在版本1和版本2之间添加了一个参数。我想支持这两个版本。

此时我做了

 extern void run(int param1); 

 ... in the code ...
 run(123);

在版本2中运行(int param1,int param2)。

我能否以某种方式动态检测我链接的库的版本? (参数数量)

我想避免让用户在Makefile中设置库版本,并使用preprocessor-ifs解决这个问题。

1 个答案:

答案 0 :(得分:0)

C代码的工作方式是v1函数只能访问第一个传递的参数。只要该参数对两个版本具有相同的含义,您就可以安全地将这两个参数传递给提供的任何函数。 v1只能看到第一个; v2将看到两个参数。

这种力量来自于C支持可变数量参数的架构需求,例如printf()。调用代码在调用完成后删除参数,并从右向左推送参数,以便第一个(最左侧)参数始终位于堆栈帧的顶部。

只有当库的API因升级而被严重亵渎时,第一个参数才有不同的含义。