警告 C4190 C 联动指定
Warning C4190 C-linkage-specified
目前我正在使用C++制作一个dll函数。之后,我使用 DllImport
将此 dll 导入我的 C# 项目。在我的C++项目中,我在第一次构建过程中收到了警告 C4190。
警告 C4190:"abc"指定了 C 链接,但返回UDT'std::basic_string' 与 C 不兼容
我当前的代码如下:
extern "C"
{
__declspec(dllexport) std::string abc(std::string targetFile)
{
return somestring;
}
}
C++ 部分:您不能extern “C"
界面中使用命名空间和C++对象。尝试使用更原始的类型,如int
、float
、char
和指针(例如 char *
) 在返回值和参数中。
C# 部分:您可以检查 MSDN 平台调用数据类型以进行转换。
两种方式:
首先需要具有/clr
选项的 Visual C++ 编译器:
public ref struct CppLib
{
static System::String^ abc(System::String^ targetFile)
{
return gcnew System::String(somestring);
}
}
C# 将其视为用 C# 编写的函数。
第二个是任何语言都可以做到的:
extern "C"
{
__declspec(dllexport) size_t abc(const char* szTargetFile, char* szResult, size_t nResultBytes)
{
std::string targetFile(szTargetFile);
strncpy(szResult, somestring, nResultBytes);
return strlen(somestring);
}
}
若要从 C# 使用,需要一个 p/invoke 声明,使用 StringBuilder
表示输出字符串的参数。
第三种方法是使用BSTR
(SysAllocString
和SysFreeString
API函数)。 C++中有一个bstr_t
包装器。 在 C# 中设置了一个属性,让 p/invoke 知道字符串是一个BSTR
。
重要的是双方就字符串的分配和解除分配方式达成一致。 这意味着永远不要使用特定于C++实现的分配函数,如std::string
构造函数/析构函数。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- 警告 C4552:">>":未使用表达式的结果
- 禁止显示由于常量为零而比较始终为假的警告
- 警告 C4190 C 联动指定
- C++代码链接中的错误:警告 C4190:类型指定了 C 链接,但返回与 C 不兼容的 UDT