标题:
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条),
- 没有非标准布局基类,
- 或者在最派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
- 没有与第一个非静态数据成员相同类型的基类.
它的名称也不应该被破坏,当类型在命名空间中或者它是模板类型时会发生.
| 归档时间: |
|
| 查看次数: |
4136 次 |
| 最近记录: |