从C代码库对C++中无符号字符*上的strchr进行微创更改

Minimally invasive change for strchr on unsigned char * in C++ from a C codebase?

本文关键字:strchr 上的 字符 代码 C++ 无符号      更新时间:2023-10-16

我正在尝试将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