警告:函数返回与C不兼容的用户定义类型

Rec*_*Hou 2 c++ xcode llvm

标题:

using namespace std;
extern "C" {
  string testFunc();
}
Run Code Online (Sandbox Code Playgroud)

的.cpp:

string testFunc()
{
  return string("test");
}
Run Code Online (Sandbox Code Playgroud)

建设时我收到了这个警告:

'testFunc' has C-linkage specified, but returns user-defined type 'string' (aka 'basic_string<char>') which is incompatible with C
Run Code Online (Sandbox Code Playgroud)

我测试了我的功能,并且正确地返回了"test".

这个警告会引起任何问题吗?

我正在使用Apple LLVM 4.2,C99,XCode 4.6中的所有默认设置.

Jos*_*eld 13

据推测,您正在包装testFuncin 的声明,extern "C"因为您希望能够从C程序中调用它.但是,当一个C程序调用这个函数时,它们将会std::string返回,这与C完全不兼容.程序将无法管理它.

要么testFunc不在里面,extern "C"要么它应该以C风格的方式返回字符串(也许作为a const char*).

对于与C兼容的类类型,它应该是标准布局类(在C++ 11术语中).

标准布局类是一个类:

  • 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
  • 没有虚函数(10.3),也没有虚基类(10.1),
  • 对所有非静态数据成员具有相同的访问控制(第11条),
  • 没有非标准布局基类,
  • 或者在最派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
  • 没有与第一个非静态数据成员相同类型的基类.

它的名称也不应该被破坏,当类型在命名空间中或者它是模板类型时会发生.