这两者有什么区别吗:
//MyFile.cpp
#include "myheader.hpp" //works fine in Apple Clang13 as well as 14
//MyFile.cpp
extern "C"
{
extern "C++"
{
#include "myheader.hpp". //compilation error in Apple Clang13
}
}
在后一种情况下,由于命名空间,我得到了编译错误,而在前一种情况下我没有得到任何这样的错误。此外,该问题仅出现在
Apple Clang13
中,而不出现在Apple Clang14
中。
myheader.hpp
还包括许多其他标题,包括 boost/dynamic_bitset.hpp
.
// In file boost/dynamic_bitset.hpp
:
:
operator<<(std::basic_ostream<Ch, Tr>& os,
const dynamic_bitset<Block, Alloc>& b)
{
using namespace std;
const ios_base::iostate ok = ios_base::goodbit;
//error - undeclared identifier ios_base in apple clang13, did you mean std::ios_base
//works fine in clang13 after changing it to std::ios_base::iostate
//works fine in apple clang14 with no change
:
:
:
}
我的实际要求是我有一个客户端代码,其中包含我在
extern "C"
块中的标头。我无法更改客户的代码。在我的标题中,我想使用C++
代码。所以,代码是这样的:
extern "C"{. //present in client's header, //can't change
:
:
extern "C++"{ // This I can change
#include "myheader.hpp".
}
}
所以,基本上我想要
C++
块内的 extern "C"
链接。有没有其他方法可以做到这一点?
注意 - 使用 Clang13 中提到的 boost header 可以重现问题。
你试图做的事情似乎根本不可能。 C 和 C++ 调用约定(在堆栈上传递的内容)可能不同,并且 C++ 名称经过修饰以允许函数重载,这是 C 不支持的。
如果您交付的是预编译代码,您所能做的就是将 C++ 函数包装在纯 C 代码中。
如果您提供源代码,请避免
extern C++ block
并确保您的头文件仅公开与 C 兼容的声明(无类)。