Apple Clang 中的外部“C++”问题

问题描述 投票:0回答:1

这两者有什么区别吗:

//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++ xcode clang clang++
1个回答
0
投票

你试图做的事情似乎根本不可能。 C 和 C++ 调用约定(在堆栈上传递的内容)可能不同,并且 C++ 名称经过修饰以允许函数重载,这是 C 不支持的。

如果您交付的是预编译代码,您所能做的就是将 C++ 函数包装在纯 C 代码中。

如果您提供源代码,请避免

extern C++ block
并确保您的头文件仅公开与 C 兼容的声明(无类)。

© www.soinside.com 2019 - 2024. All rights reserved.