2012-04-11 37 views
2

我在外部库中调用了在版本1和版本2之间添加参数的函数。我想支持这两个版本。在编译时选择/发现extern函数调用的签名

在这一点上我做

extern void run(int param1); 

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

在它的运行版本2(INT参数1,INT参数2)。

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

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

+0

它是什么库?如果图书馆的开发人员有前瞻性的想法,那么图书馆用户可以获得图书馆版本。可能是一个函数或全局变量。没有这样的版本可读性,更改库API的调用签名就是邪恶的。 – TJD 2012-04-11 21:14:39

+0

不幸的是,虽然我猜我可以在运行make时从库目录的README中抓取/ grep它。 – j13r 2012-04-11 21:16:07

回答

0

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

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

只有当库的API被恶意升级时,第一个参数才会有不同的含义。

+0

假设这个函数是在头文件中声明的,编译器将不接受这个代码。即使它确实(或没有声明),标准中的任何内容都不能保证它能起作用。 (编译器可以为variardic函数实现不同的调用转换) – asaelr 2012-04-12 00:41:06

相关问题