在混合 C/C++ 项目中,我们需要从 C 调用 C++ 函数。要调用的函数被重载为三个单独的函数,但我们可以从 C 端忽略这一点,我们只需选择最合适的一个并坚持使用该函数。
有两种方法可以做到这一点:(1) 编写一个带有 extern“C” 函数的小型 C++ 包装器,将调用转发到所选的重载函数,或者 (2) 一种简单的方法来声明我们想要从中调用的一个函数C 作为外部“C”。
问题是,选择第二个变体是否有任何缺点(除了噩梦和恶业之外)?换句话说,给定三个重载函数,其中一个被声明为 exern“C”,我们是否应该预期 C++ 方面会出现麻烦,或者这是根据标准定义好的?
我相信标准中的语言是专门编写的,只允许一个具有“C”链接的函数,以及任意数量具有“C++”链接的其他函数,这些函数重载相同的名称(§[dcl.link]/6):
最多一个具有特定名称的函数可以具有 C 语言链接。具有相同函数名(忽略限定它的命名空间名称)的 C 语言链接函数的两个声明出现在不同的命名空间范围中,引用相同的函数。具有相同名称(忽略限定它的命名空间名称)的 C 语言链接对象的两个声明出现在不同的命名空间范围中,引用同一对象。
该标准显示了以下示例:
complex sqrt(complex); // C + + linkage by default
extern "C" {
double sqrt(double); // C linkage
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)