2

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この状況の人々がやることになるかどうか(または一般的な名前がある場合は一般的な名前)を追加します。

4

1 に答える 1

2

最初の注意:これも非常に醜いことだと思いますが、(うまくいけば)より良いアイデアに役立つかもしれません!

マクロを使用するのはどうですか。

#define strchr(s, c) ((unsigned char const *)strchr((char const *)s, c))

Makefile / buildスクリプトからコンパイルフラグ(-D)として含めることができます。C++プロジェクト用のカスタムMakefile/buildスクリプトがあると思いますので、このマクロをCコードベースに追加する必要はありません。

少し良くするために、Makefile / buildスクリプトからインクルードする追加のファイルを使用できます。これにより、これらのマクロが(より)構造化された方法で追加されます。CPPFLAGS

于 2012-12-16T23:04:18.020 に答える