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

Warning: Function return user-defined type which is incompatible with C

本文关键字:用户 定义 类型 不兼容 函数 返回 警告      更新时间:2023-10-16

标题:

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中的所有默认设置。

假设您将testFunc的声明封装在extern "C"中,因为您希望能够从C程序中调用它。然而,当C程序调用这个函数时,他们会得到一个与C完全不兼容的std::string。该程序将无法管理它。

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

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

标准布局类是指:

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

它的名称也不应该被篡改,当类型在命名空间中或是模板类型时就会发生这种情况。