从C代码库对C++中无符号字符*上的strchr进行微创更改
Minimally invasive change for strchr on unsigned char * in C++ from a C codebase?
我正在尝试将C代码库编译为C++,并对其中的一些内容进行了调整。它在无符号字符指针上使用strchr()
,例如:
#include <string.h>
#include <stdio.h>
// Cannot modify this file with any non-C-isms, but let's say an include can
// be changed (although all things being equal I'd rather not)
#include <SomethingICanChange.h>
int main(int argc, char* argv[]) {
unsigned char b = 'B';
unsigned char const * str = "ABC";
unsigned char const * pos = strchr(str, b);
if (pos) {
printf("position is %dn", pos - str);
}
return 0;
}
这导致C++中出现错误(原因在其他地方解释)。。。即使使用CCD_ 2。
test.c: In function ‘int main(int, char**)’:
test.c:6:33: warning: invalid conversion from ‘const char*’ to ‘const unsigned char*’ [-fpermissive]
test.c:7:46: error: call of overloaded ‘strchr(const unsigned char*&, unsigned char&)’ is ambiguous
test.c:7:46: note: candidates are:
In file included from test.c:1:0:
/usr/include/string.h:215:14: note: char* strchr(char*, int) <near match>
/usr/include/string.h:215:14: note: no known conversion for argument 1 from ‘const unsigned char*’ to ‘char*’
/usr/include/string.h:217:22: note: const char* strchr(const char*, int) <near match>
/usr/include/string.h:217:22: note: no known conversion for argument 1 from ‘const unsigned char*’ to ‘const char*’
通常当面对这种事情时,我会说"strchr,是的,完全摆脱它"。但我不想自己修改这些文件,这是C代码,它可以移植到相当旧的平台上。为了安抚C++,他们会不乐意在调用站点上放演员阵容。。。不过,如果"struchr"存在并且是标准的,他们可能会使用它。
我也可以用某种方式破解它,比如在SomethingICanChange.h
中,我可以添加:
unsigned char const * strchr(unsigned char const * s, int c) {
return (unsigned char const *)strchr((char const *)s, c);
}
这适用于-fpermissive
。但是,如果没有#ifdef,我将无法将重载检查到C代码库中。只是想知道是否有人有更好的想法,我会推荐添加struchr
,如果这种情况下的人最终会这么做(或者,如果有一个常见的名字,可以使用任何常见的名字)。
初始注意:我知道这也是一件很丑陋的事情,但它可能会帮助你(希望)想出更好的主意!
如何使用宏:
#define strchr(s, c) ((unsigned char const *)strchr((char const *)s, c))
您可以将它作为编译标志(-D)包含在Makefile/build脚本中。我想您的C++项目有一个自定义的Makefile/build脚本,所以您不需要将这个宏添加到C代码库中。
为了使稍微更好,您可以使用一个额外的文件,该文件包含在Makefile/build脚本中,它以(更)结构化的方式将这些宏添加到CPPFLAGS
中
相关文章:
- Linux的Cpp上的计时器
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 物理键盘上的触发器按键
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 集合上的输出迭代器:assign和increment迭代器
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 对于set上的循环-获取next元素迭代器
- 如何从棋盘上的箱号中找到行和列
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- if数组上的随机数
- 向量上的线性搜索
- 位阵列上的快速AND运算
- 无法将 GLFW 库与 Ubuntu 18.04 上的头文件链接
- 为什么一个向量上的多线程操作很慢
- 64位机器上的C++内存对齐
- 从C代码库对C++中无符号字符*上的strchr进行微创更改