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

10-10 04:49