Visual Studio编译picohttpparser示例报错:无法将char**转const char**
问题:picohttpparser在Visual Studio中编译失败的原因及解决办法
我在使用C语言HTTP解析器picohttpparser时,在Visual Studio中编译示例代码失败。调用phr_parse_request函数时,传入char**类型的&method、&path作为实参,但函数对应形参类型为const char**,触发如下编译错误:
Error C2664 'int phr_parse_request(const char ,size_t,const char*,size_t *,const char **,size_t *,int *,phr_header *,size_t *,size_t)': cannot convert argument 3 from 'char **' to 'const char **'
示例代码如下:
int phr_parse_request(const char *buf_start, size_t len, const char **method, size_t *method_len, const char **path, size_t *path_len, int *minor_version, struct phr_header *headers, size_t *num_headers, size_t last_len) { return 1;} char buf[4096], *method, *path; int pret, minor_version; struct phr_header headers[100]; size_t buflen = 0, prevbuflen = 0, method_len, path_len, num_headers; ssize_t rret; while (1) { /* read the request */ while ((rret = read(sock, buf + buflen, sizeof(buf) - buflen)) == -1 && errno == EINTR) ; if (rret <= 0) return IOError; prevbuflen = buflen; buflen += rret; /* parse the request */ num_headers = sizeof(headers) / sizeof(headers[0]); pret = phr_parse_request(buf, buflen, &method, &method_len, &path, &path_len, &minor_version, headers, &num_headers, prevbuflen); // CAN'T CALL THIS FUNCTION BECAUSE &method is char** and the function expects a const char**
原因分析
C语言的类型安全规则禁止char**直接隐式转换为const char**,这是为了避免潜在的常量被修改的风险:如果允许转换,函数内部可通过const char**修改指针指向,让原本的char*指向const char内存区域,后续代码若通过该char*修改内容,会触发未定义行为。
不同编译器对该规则的严格程度不同:GCC等编译器可能仅给出警告,但Visual Studio的C编译器(MSVC)对类型匹配要求更严格,直接抛出C2664错误。
解决办法
有两种常见修复方式:
- 修改变量类型:将
method和path的类型从char*改为const char*,此时&method和&path的类型就是const char**,与函数形参完全匹配:const char *method, *path; - 显式强制类型转换:若不想修改变量类型,可在传参时强制转换为
const char**,但需注意后续不能通过method或path修改指向的内容(否则会触发未定义行为):pret = phr_parse_request(buf, buflen, (const char**)&method, &method_len, (const char**)&path, &path_len, &minor_version, headers, &num_headers, prevbuflen);
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

