C+中无符号字符*上的strchr微创改变+;从C代码库? 我试图编译一个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 %d\n", pos - str); } return 0; }

C+中无符号字符*上的strchr微创改变+;从C代码库? 我试图编译一个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 %d\n", pos - str); } return 0; },c++,c,unsigned-char,strchr,C++,C,Unsigned Char,Strchr,通常当我面对这种事情时,我会说“哎哟,把它彻底处理掉”。但我不想自己修改这些文件,而这是C代码,它一直保持着很好的可移植性。他们不高兴把Casts放到CalPosits上来安慰C++……但是如果一个“Struur”存在并且是标准的,他们可能会使用它。 我也可以通过这样或那样的方式破解它,比如在SomethingICanChange.h中我可以添加: unsigned char const * strchr(unsigned char const * s, int c) { return

通常当我面对这种事情时,我会说“哎哟,把它彻底处理掉”。但我不想自己修改这些文件,而这是C代码,它一直保持着很好的可移植性。他们不高兴把Casts放到CalPosits上来安慰C++……但是如果一个“Struur”存在并且是标准的,他们可能会使用它。 我也可以通过这样或那样的方式破解它,比如在
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)包含。我想你有一个自定义的MaCuff/Bug脚本用于C++项目,所以你不需要把这个宏添加到C代码库。
为了让它稍微好一点,您可以使用一个额外的文件,从Makefile/build脚本中包括,它以(更)结构化的方式将这些宏添加到
CPPFLAGS

“我试图将C代码库编译为C++”-这基本上是一个错误,但是如果你决定这么做,我想在C++中添加重载,使C函数在C++中可以用相同的方式调用,这是正确的。这会让你一直坚持下去,直到你发现C代码在一个
无符号字符*
上调用
strchr
,但将结果分配给一个
char*
——然后你只需说服C程序员,尽管这是允许的,但仍然是不对的,他们应该改变他们的代码。@ SteveJessop至少曾经一度认为C++的力量是它能够给旧的代码库带来增量的好处。如果这是真的,尽管我猜重载是一种工具,如果没有其他人像现有技术那样遇到这个问题。但是,是的,这可能会导致一个痛苦的世界。我愿意试一试,看看是否有更多的牙齿进入到类型捕捉到错误,可以修补回C修复…如果这是可行的,也许会推动更多。当然,这是有争议的。而且在一定程度上,你可以在C++中使用C代码库,在修复了一些语法的东西之后,将它编译成C++,它可能会像以前一样做大致相同的事情,所以不会有太多的bug需要修复。然后它不再是C,并且随着代码从那个点演变,可以逐步使用C++特征。我不认为你所说的“力量”与维护多语言代码有任何关系。例外的是共享的头文件,包含“代码>外部”C“/Cuth>接口,它们是使用<代码>、”Apple、CPLUS PLUS < /代码>的双语言。然后,如果您想用C++编写的与C编写的其他代码混合的代码库,那么您可以得到C链接的支持。用C编译器编写C语言编写的组件,用C++编写的C++组件。简单!:-)注意,在
无符号字符*
参数上使用
strchr
也是无效的。C没有从
unsigned char*
char*
的隐式转换,即使“plain”
char
恰好是无符号的。GCC和其他一些编译器在接受无效的C..1表示邪恶方面是出了名的糟糕。:-)在某些情况下可能有用,但我认为过载的安全性更适合我的情况。。。
#define strchr(s, c) ((unsigned char const *)strchr((char const *)s, c))