CコードベースをC++としてコンパイルし、インクルードの一部を微調整しようとしています。strchr()
unsignedcharポインタで使用します。例:
#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、yuck、ただそれを完全に取り除く」に行きます。しかし、私はこれらのファイルを自分で変更したくありません。これは、かなり古いプラットフォームに非常に移植性が保たれている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
この状況の人々がやることになるかどうか(または一般的な名前がある場合は一般的な名前)を追加します。