Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有直接C兼容性的语言 除了C++之外,强>哪些非玩具语言与C?< /Stand >具有直接或容易使用的兼容性,如“我可以在那里取C库,并在不必查找、编写或配置某种包装的情况下编译代码”。_C++_C - Fatal编程技术网

具有直接C兼容性的语言 除了C++之外,强>哪些非玩具语言与C?< /Stand >具有直接或容易使用的兼容性,如“我可以在那里取C库,并在不必查找、编写或配置某种包装的情况下编译代码”。

具有直接C兼容性的语言 除了C++之外,强>哪些非玩具语言与C?< /Stand >具有直接或容易使用的兼容性,如“我可以在那里取C库,并在不必查找、编写或配置某种包装的情况下编译代码”。,c++,c,C++,C,我知道很多语言通过某种形式的外部调用或绑定与C兼容(我一直在使用Java、Ruby、Python等中的绑定,所以我知道这是可以做到的)。但是,您需要依靠某个人(可能是您)来编写和维护所有要使用的库的绑定,并且该绑定必须在所有平台上工作,等等 P>比C++有更多的表达语言吗? 感谢大家提到swig或相关的包装生成工具。 我知道这些是存在的,但我不认为它们真的像C->C++集成那么简单。。。但是,在C++中,与C集成可能是唯一容易的事情)) Objective-C,C和Smalltalk的私生子

我知道很多语言通过某种形式的外部调用或绑定与C兼容(我一直在使用Java、Ruby、Python等中的绑定,所以我知道这是可以做到的)。但是,您需要依靠某个人(可能是您)来编写和维护所有要使用的库的绑定,并且该绑定必须在所有平台上工作,等等

<> P>比C++有更多的表达语言吗? 感谢大家提到swig或相关的包装生成工具。
我知道这些是存在的,但我不认为它们真的像C->C++集成那么简单。。。但是,在C++中,与C集成可能是唯一容易的事情)) Objective-C,C和Smalltalk的私生子

Objective-C是C的一个直接超集(没有比这更兼容的了),但是有些语言可以编译成C。最近的一些例子是和


大多数静态编译语言允许与C库接口。这类语言的例子有Ada、Fortran、Pascal和D。细节是特定于平台和编译器的;对于x86,这基本上意味着支持cdecl调用约定。

与C ABI兼容。然而,有时将C头文件转换成兼容的D模块是非常重要的。有关详细信息,请参阅。

使用正确的编译器/链接器、名称更改和函数参数,可以链接C和Fortran模块。详细信息。

Python有一个动态包装模块,虽然它没有完全消除样板绑定代码,但确实大大减少了它。

对于许多语言,C库的包装代码并不难编写-只需使用SWIG:

虽然最初是作为Tcl的快速包装生成器编写的,但现在它支持: Tcl、Python、Perl、Guile、Java、Ruby、Scheme、PHP、Ocaml、Pike、C#、Modula-3、Lua、commonlisp、R和Octave

如果您使用它支持的任何语言,请尝试一下。对于处理字符串、整数和浮点数的C函数,它非常容易使用。对于更复杂的C函数,它显然变得更复杂。

G'day

通过在两者之间编写XS接口,可以将Perl连接到C库。这是我的建议

这就是XML::LibXML和XML::LibXSLT模块的实现方式

您还可以通过pragma导入将Ada连接到C库。对于C++编写的库也是如此。以及COBOL和FORTRAN BTW


干杯,

Fortran可以调用C例程,也可以被C调用。正如另一个答案中所述,这曾经是“特定于平台和编译器的”,但Fortran 2003包括“ISO C绑定”,这使这部分成为语言标准,因此是可移植的,而不是特定于平台和编译器的。许多Fortran编译器都支持ISO C绑定,包括gfortran(>=4.3)、Intel ifort、Sun Fortran等


您确实需要编写被调用的C例程的“接口”描述,但它是编译器和平台无关的。

D并不是可以直接调用C函数的语言的唯一示例:其他的有Ada、Fortran、Pascal。。。;大多数编译语言(如静态编译为机器代码)都可以与C接口,但细节是编译器特有的,谢谢,但我实际上有点想把D作为我问题的一个例子;)。我曾尝试使用D调用SDL函数,但在与废弃(或者更准确地说,为了得到一个可用的废弃版本而必须使用的六个构建工具和D库)的斗争中失败了。这可能是我的错,这是一个耻辱,因为看起来很有趣,但我只是不能在几天内做什么“ExcN(C){”在C++ +…(我从来没有尝试过D,但是对我来说似乎很容易……克里斯托夫:是的,它看起来很简单,我试过了……但是后来我意识到有些人发现需要编写和维护这类代码……而且我肯定会考虑打包。)更不用说我不能让它工作,但我完全准备好将其归因于我自己的愚蠢。@phtrivier:wrapper对于既不是C扩展(即具有不同的语法和/或类型系统)的语言来说是一个必要的恶魔或者不允许嵌入C代码;没有办法重新声明类型/函数……C库(尤其是那些不打算用于C++的旧版本)的访问可能根本不存在“直接访问和易于使用的C++”,因为你必须确保C++守护者正在做外部“C”。为了防止名称损坏问题。通常情况下,由于指针类型的使用等方面的不同做法,您还会遇到更多美学问题。我认为您不会找到比Objective C更兼容C的语言。@phtrivier,根据您的新注释,我想Ada仍然会通过使用pragma Import来做到这一点。直接Ada代码和C代码之间的绑定。除非您的C代码使用指向函数的指针,否则不需要包装。这在公司中广泛使用,以兼容较旧的库(用于数学、金融、物理、气象等)。该链接描述了“旧的”连接Fortran和C的方法,在这种方法中,您必须了解参数传递机制、名称混乱等,并且该方法依赖于编译器使用Fortran ISO C绑定的方法更简单、更好。我已经使用了这两种方法。它可能不完全适合OP请求,但是+1,因为ctypes真的很好!@Terry:Vala和Lisaac可能被认为是“玩具语言”,但是其他的呢?如果你在寻找编译成C的语言,你会发现玩具/研究/领域特定的语言or编译器原型,因为其他语言很可能最终得到一个编译器,它可以编译到m