1

関数用のAPIがあります。たとえば、次のようになります。

void func (const char** s,const size_t* ss);

つまり、関数はnullで終了する文字列のconst配列[ s]とそのサイズ[ ss]を取得します。実行時に文字列を取得しますが、その量を認識していません。私がやろうと思ったのは、定義することです-vector<char*> vSそれに文字列を挿入し、定義するvector<size_t> vSS-それに文字列のサイズを挿入します。最終的にはに転送vector<char*> vSする必要がconst char** ありvector<size_t> vSSますconst size_t*。私はそれがトリック&vS[0]/を存在することを知ってい&vSS[0]ます。問題は、上記がそれぞれchar**とを生成することsize_t* ssです。しかし、私はconstがありません。この問題はどのように解決できますか?

4

3 に答える 3

2

APIを修正してconst-correctにすることができる場合は、次のように変更します。

void func (const char* const* s,const size_t* ss);

それ以外の場合、ベクトルを介して文字列の内容を変更する必要がない場合は、ベクトルを次のように変更します。

vector<const char*> vS;

const_castそれ以外の場合は、何も変更しないようにAPIを実行して信頼する必要があります。

func(const_cast<const char**>(&vS[0]), &vSS[0]);

(興味がある場合char**、関数の取得に渡す際の問題const char**は、関数がポインターの1つを変更して、を指すようにする可能性があることconst charです。呼び出し元は、そのオブジェクトへの非定数ポインターを持ち、const試行を妨げるものは何もありません。ブーム!未定義の動作。)

于 2013-01-23T14:09:00.570 に答える
1

と宣言するvSだけ

vector<const char*> vS;

次に&vS[0]ですconst char**。そしてsize_t*暗黙的にに変換することができconst size_t*ます。

(ちなみに、funcおそらく

void func(const char* const* s, const size_t* ss);

ただし、上記はどちらの方法でも機能します。)

于 2013-01-23T14:03:49.683 に答える
1

関数にパラメータを渡す場合(そして引数に結果を戻そうとしない場合)、非定数性は問題ではありません。必要なchar *場所であればどこでも使用できますcont char *

ただし、ダブルポインタconst char **などに問題があります。const違反につながる可能性があるため、暗黙的に変換されません。説明はC++FAQLightで読むことができます。

あなたの場合vector<const char*>、@ ascheplerが言ったように、あなたはただ作成することができます。

ところで、const char**「charへのポインタへのconstポインタ」ではなく、「charへのconstポインタへのポインタ」ですconst。関数が外部ポインタの内容を変更しないようにする場合は、別のポインタを追加する必要があります。const char * const *またはchar const * const *、これは同じです-constへのポインタconst文字へのポインタ。

(ところで、右から左への読み取りは、複数の定数を処理するときに役立ちます。前の段落の最後の式で試してください。はい、constこの式の最後に別の式を追加して、「constポインターからconstポインターへ」を取得できます。 const char ")。

于 2013-01-23T14:08:53.147 に答える