4

标题:

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

我已经测试了我的功能,并且“测试”已正确返回。

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

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

4

1 回答 1

14

大概您正在包装 in 的声明,testFunc因为extern "C"您希望能够从 C 程序中调用它。但是,当 C 程序调用此函数时,他们会得到一个std::string返回,这与 C 完全不兼容。程序将无法管理它。

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

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

标准布局类是这样的类:

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

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

于 2013-03-27T09:55:37.243 回答