警告:函数返回与C不兼容的用户定义类型
Warning: Function return user-defined type which is incompatible with C
标题:
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(
- 没有非标准布局基类
- 在最派生的类中没有非静态数据成员,并且最多有一个基类具有非静态数据会员,或者没有基类具有非静止数据会员,以及
- 没有与第一个非静态数据成员类型相同的基类
它的名称也不应该被篡改,当类型在命名空间中或是模板类型时就会发生这种情况。
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- Visual C++(VS2017)中用户定义的转换不明确
- 使用用户定义的参数调用future/async并调用类方法
- 带有用户定义类的c++折叠表达式
- g++用户定义的动态链接库上的全局new和delete运算符
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 修改"std::set"中用户定义类型的值
- 参数包构造函数在类模板中隐藏用户定义的转换
- MAKE:找不到包含的用户定义的头文件?
- C++:用户定义的显式类型转换函数错误
- 从用户定义的类生成格式字符串?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- C++ 向量与用户定义的类比较?(==, <, >)
- STL 用户定义的二进制操作
- 将用户定义的类型与 std::vector 和 std::sort 一起使用
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 使用宏编译时使用用户定义的数学函数,或者仅使用 c++ 中标准数学库中的函数
- C++:用户定义的类,以成员字段作为地址