有两种方法可以做到这一点:(1)使用一个外部“C”函数编写一个小的C包装器,该函数将调用转发到所选择的重载函数,或者(2)黑客方法来声明我们要调用的一个函数C作为extern“C”.
问题是,第二个变种有什么缺点(除了恶梦和坏业力)吗?换句话说,给定三个过载的函数,哪里被声明为ex“C”,我们应该期待C方面的麻烦,还是根据标准定义好?
解决方法
complex sqrt(complex); // C + + linkage by default extern "C" { double sqrt(double); // C linkage }
两点:1)举个例子,这不是规范性的. 2)它不直接声明这两个声明实际上是允许在同一个程序中.尽管如此,我认为它的意图是它可以被看作是一个单一的代码段,它给出了定义的行为.
在重读之后,我相信标准中的语言是专门用于写出一个具有“C”连接的函数,以及任意数量的具有“C”连接的其他函数,它们重载相同的名称(§7.5/ 6):
At most one function with a particular name can have C language linkage. Two declarations for a function with C language linkage with the same function name (ignoring the namespace names that qualify it) that appear in different namespace scopes refer to the same function. Two declarations for an object with C language linkage with the same name (ignoring the namespace names that qualify it) that appear in different namespace scopes refer to the same object.