部首:
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中的所有默认设置。
答案 0 :(得分:13)
据推测,您要在testFunc
中包含extern "C"
的声明,因为您希望能够从C程序中调用它。但是,当C程序调用此函数时,它们将返回std::string
,这与C完全不兼容。程序将无法管理它。
testFunc
不应该在extern "C"
内,或者它应该以C风格的方式返回字符串(可能是const char*
)。
要使类型与C兼容,它应该是标准布局类(在C ++ 11术语中)。
标准布局类是一个类:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
- 没有虚函数(10.3),没有虚基类(10.1),
- 对所有非静态数据成员具有相同的访问控制(第11条),
- 没有非标准布局基类
- 在大多数派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有包含非静态数据成员的基类,并且
- 没有与第一个非静态数据成员相同类型的基类。
它的名称也不应该被破坏,当类型在命名空间中或者它是模板类型时会发生。