如何检测lib调用者正在使用的语言?

时间:2013-04-11 21:05:23

标签: c fortran

我正在用C ++编写一个静态库,希望它可以被Fortran或者C使用。由于Fortran的所有索引都是从1开始的,所以我必须在Fortran调用时在我的库中进行一些索引修改。因为我将一个索引数组传递给库,这对于进一步计算很重要。

当然,解决这个问题的直观方法是在界面设置一个参数,让用户告诉我他们使用的语言,但我认为这不是一个很酷的方法。

所以我想知道无论如何在我的库中检测它是否被Fortran或C调用?

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您只是传递数组及其长度,那么应该没有任何问题。问题是只有传递索引,然后您需要知道该索引相对于什么。 (如果数组显式声明以不同于1的索引开头,那么在Fortran中可以是任何值)。如果您有这种情况,我的建议是为将转换索引值的其中一种语言编写胶水例程,然后调用常规库例程。这个解决方案的问题在于它要求“特殊”语言的用户调用特殊的胶水程序;调用常规例程是一个错误。

答案 1 :(得分:0)

将构建任何语言的应用程序和库,以针对相同的ABI。 ABI定义了调用约定和其他细节,使得不同编译器(可能针对不同语言)构建的两个函数可以相互调用。呼叫中不应该有任何明显不同的内容,因为我们已经付出了巨大努力来避免这些差异。

您可以查找带外信息,例如FORTRAN编译器提供的符号(或从其实用程序库中提取)。您将使用weak属性声明一些符号,如果它变为有效,您将知道当前可执行映像中有某些某些 。但是,你无法知道它是直接打电话给你,还是只是因为其他一些图书馆被拉进来。

正确的解决方案似乎是使用显式包装来从FORTRAN调用C:Calling a FORTRAN subroutine from C

答案 2 :(得分:0)

如果设置起始索引会更好。 Fortran数组不一定必须从1开始。它们可以从任何数字开始。该数组可能已声明为

float, dimension(-20:20):: neg
float, dimension(4:99) pos

所以将指数5传递给neg将意味着第26个元素并且为pos传递5的索引将意味着第二个元素。