我正在尝试将C代码库编译为C++,并调整其中的一些内容。它在未签名的char指针上使用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 %d\n", pos - str);
}
return 0;
}
即使使用
-fpermissive
,这也会在C++中导致错误(原因在其他地方说明)。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
一起使用。但是我无法检查C代码库中的重载(很好,没有#ifdef)。我只是想知道是否有人有更好的主意,所以我会加struchr
,如果这是这种情况下人们最终会做的事情(或者如果有一个普通的名字,就是任何普通的名字)。 最佳答案
初始说明:我知道这也是一件很丑陋的事情,但是它可以帮助您(希望)有一个更好的主意!
如何使用宏:
#define strchr(s, c) ((unsigned char const *)strchr((char const *)s, c))
您可以将其作为Makefile / build脚本中的编译标志(-D)包括在内。我想您为C++项目有一个自定义的Makefile / build脚本,因此您无需将此宏添加到C代码库中。
为了使其更好一点,可以使用Makefile / build脚本中包含的其他文件,该文件以(更多)结构化的方式将这些宏添加到
CPPFLAGS
关于c++ - 从C代码库在C++中对unsigned char *上的strchr进行微创更改?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13906150/