当用C++20标准时,字符串字面量必须用const修饰,否则无法编译通过。
但是CTP的接口函数的参数类型是不带const的,接口函数的定义在动态链接库,无法修改。
要么改用C++17标准,要么修改代码来支持C++20标准。
注册前置地址函数原型
virtual void RegisterFront(char *pszFrontAddress) = 0;
对于字符串字面量
//不要用
const char *MdFrontAddr ="tcp://180.168.146.187:10131";
//改成
char *MdFrontAddr = const_cast<char *>("tcp://180.168.146.187:10131");
//最简单
char MdFrontAddr[] = "tcp://180.168.146.187:10131";
订阅合约的函数原型如下
virtual int SubscribeMarketData(char *ppInstrumentID[], int nCount) = 0;
参数定义 char* ppInstrumentID[] = { "rb2410", "sc2407" };
报错:E0144 “const char *” 类型的值不能用于初始化 “char *” 类型的实体
修改配置,依次点击项目->属性->C/C+±>语言->符合模式,将原来的“是”改为“否”。
报错:C1214 模块与通过“/Zc:twoPhase-”请求的非标准行为发生冲突
改成:const char* ppInstrument[] = { "rb2410", "sc2407" };
报错:E0167 “const char **” 类型的实参与 “char **” 类型的形参不兼容
因为函数接受的是char *ppInstrumentID[]
,也就是char **类型, 又不能去修改接口,只能从代码上解决问题。
解决方案
const char *ppInstrument[] = {"rb2410", "sc2407"};
char **ptr= const_cast<char **>(ppInstrument);
chatgpt检查说是代码有问题,描述如下。
尝试使用 const_cast
将 const char*[]
类型的数组指针 ppInstrument
转换为 char**
类型的指针 ptr
,但是这种转换是不合法的,因为 const_cast
只能用于去除表达式的 const
或 volatile
修饰符,而不能改变指针指向的类型。
对于 const char*[]
类型的数组指针 ppInstrument
,它指向的是一组指向常量字符的指针数组,而 char**
类型的指针 ptr
指向的是一个指向字符指针的指针,它们的类型不兼容。
我自己尝试可以编译通过,也可以正常使用。根据逻辑验证过,应该没有问题。
其他解决方案:
char* ppInstrument[] = { (char*)"rb2410", (char*)"sc2407" };
// 或者循环用const_cast
char *nonConstStrings[2];
for (int i = 0; i < 2; ++i) {
nonConstStrings[i] = const_cast<char *>(strings[i]);
}