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

时间:2013-03-27 09:52:49

标签: c++ xcode llvm

部首:

using namespace std;
extern "C" {
  string testFunc();
}

的.cpp:

string testFunc()
{
  return string("test");
}

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

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

我测试了我的功能并正确地返回了“test”。

此警告会导致任何问题吗?

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

1 个答案:

答案 0 :(得分:13)

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

testFunc不应该在extern "C"内,或者它应该以C风格的方式返回字符串(可能是const char*)。

要使类型与C兼容,它应该是标准布局类(在C ++ 11术语中)。

  

标准布局类是一个类:

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

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