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

问题描述:

我正在用C++编写一个静态库,期望它可以被Fortran或C使用。由于Fortran的索引从1开始,我必须在Fortran调用时在库中进行一些索引修改。因为我正在向库中传递一系列索引,所以对于进一步计算而言非常重要。如何检测lib调用方正在使用的语言?

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

所以我想知道是否有反正在我的图书馆检测是否由Fortran或C调用?

谢谢!

+2

您当然不会对Fortran用户那么好。从C调用Fortran库时,库不会为您执行任何索引修改。 – 2013-04-11 21:13:33

+0

真的没有理由去做这样的想法。数组索引只是一个映射到内存中的偏移量。如果其他语言对此进行不同的映射,则无所谓。在Fortran中,你可以有不同的例程以不同的方式对同一个数组进行索引,这完全没有问题。 (** Fortran不是严格基于1!**) – 2013-04-12 08:25:53

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

您可以寻找带外信息,如由FORTRAN编译器提供的符号(或从其公用程序库中提取)。你会声明一些带有weak属性的符号,如果它有效,你会知道在当前的可执行映像中有某些 FORTRAN 某处。但是,你无法知道它是否直接或简单地给你打电话由于拉一些其他图书馆

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

如果你只是传递数组及其长度,不应该有任何问题。问题是只有当你传递一个索引时,你才需要知道该索引与哪个索引相关。 (如果数组被明确声明为以非一个索引开始,那么Fortran中的值可以是任何值。如果你有这种情况,我的建议是为其中一种将转换索引值的语言编写粘合例程,然后调用常规库例程。这个解决方案的问题是,它要求“特殊”语言的用户调用特殊的粘连例程;调用常规程序是一个错误。

+0

M. S. B.,谢谢您的回答。是的,你是对的我正在传递一系列索引,我已经编辑了这个问题来说明问题。但我认为让用户调用一个特殊的例程与让他们在例程中增加一个参数告诉我他们使用的是什么语言几乎是一样的。再次感谢! – 2013-04-12 22:22:26

+0

另一种方法是传递起始索引值,而不是传递说明语言的参数。这也将处理Fortran中非默认起始索引的情况。 – 2013-04-13 00:27:43

如果你设置一个开始索引,会更好。 Fortran数组不一定必须从1开始。它们可以从任何数字开始。该阵列可被声明为

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

因此,对于负传递一个索引的5将意味着第26元件和传递的5的指数的POS将意味着第二元件。