除C之外的其他C ++链接语言?


25

C ++语言允许将C ++和C混合在一个源文件中。例如,

extern "C" {
    struct bar { /* ... */ }
}

C ++或曾经支持C以外的任何其他“链接语言”吗?例如extern "Pascal"extern "Haskell"


在大多数情况下,两种语言都将尽其所能extern "C"相互交流
棘手怪胎

C ++通过允许实现添加其链接类型来支持其他链接(第7.5节),问题应该是“实现是否存在或存在实现” ;-)
johannes

2
extern "C"仅影响链接,不影响块内文本的语法和语义。换句话说,它仍然是C ++ extern "C"。符号名称只是不整齐。参见stackoverflow.com/q/1041866/712605
理查德·汉森

Answers:


17

extern "C" 可能是唯一需要的一个:

每个实现都应提供与使用C编程语言“ C”编写的函数的链接,以及与C ++函数“ C ++”的链接。

但是,根据此引用可以存在其他:

文字字符串表示所需的语言链接。该国际标准规定了字符串文字“ C”和“ C ++”的语义。根据实现定义的语义,有条件地支持使用非“ C”或“ C ++”的字符串字面量。[注意:因此,实现中未知的带有字符串文字的链接规范需要诊断。—尾注] [注意:建议从定义该语言的文档中获取字串字面拼写。例如,取决于年份,Ada(不是ADA)和Fortran或FORTRAN。—尾注]


1
这是从哪里引来的?
paul 2013年

@paul c ++ 11标准草案
aaronman

9

在许多(大多数)环境中,“ extern“ C”是系统上任何语言的默认链接约定。

因此,根据操作系统和“外部”语言“ extern C”的实现,您需要用另一种编译语言来调用程序。


即使不使用C链接的环境(Pascal,即通常在堆栈上使用其他参数顺序,而被调用者也必须释放值),它们也具有C兼容模式
johannes

@johannes:实际上Windows在很多事情上都使用Pascal约定,但是由于它在C中也需要使用Pascal约定,并且C不具有“ extern "Language"”语法,所以它们通过特定于平台的C扩展来做到这一点,因此对于C ++来说,它仍然只是extern "C"特殊的关键字指定不同的调用约定。
2013年

1
仍然可能存在编译器供应商添加特殊链接类型的情况。除了与其他语言的互操作性之外,这对于与不同C ++名称修饰的互操作性也可能很有趣。问题是是否有人做过:)
johannes


-4
  • 没有!C ++仅支持将C作为“链接语言”。

  • extern“ C” {结构条{/ * ... * /}}

  • 上面的语法意味着不要更改变量,结构或函数的名称。因为C ++可能会更改变量,结构或函数的名称以实现Class,Namespace和函数重载。

  • 如果不这样做,链接器可能找不到变量的对象,函数的结构。

  • C ++设计为与C兼容。外部“ C”是实现与C兼容的方式。


10
请检查C ++标准的§7.5。extern "C"并且extern "C++"是唯一强制性的,但允许实现提供其他实现。
johannes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.