2016-04-03 24 views
1

次のコードはコンパイルできません。変換タイプに「char **」「のconstのchar **」

char** s; 
    const char** s2 = s; 

私は以下が動作することができます知っているが、私が行うためにいくつかのより良い合法的な方法があるはずだと思いますそれ?

long long x = reinterpret_cast<long long>(s); 
    s2 = reinterpret_cast<const char**>(x); 

この質問の背景には、私は異なるシグネチャとのargc/argvの取り扱い 機能を持つ2つのライブラリを使用したいされています

void Init1(int argc, char** argv); 
void Init2(int argc, const char** argv); 

を次にメインの私の署名を定義するための最良の方法は何でしょうそれらの2つの関数の両方を呼び出すのですか?

答えて

2

追加または削除することができ++ Cでconst_castconst -ness、例えば:

char** s; 
const char** t = const_cast<const char**>(s); 

あなたはInit2 doesnの限り、彼らへのconstネスを追加するのは非常に安全なはずのargvを扱っているので、何も変えようとしません。その引数はconst char**なのではありません。

cv修飾子を削除した後にconstという変数の値を変更しようとすると、定義されていない動作が発生することに注意してください。

+0

この変換の問題は、 'Init2'がconst文字(キャストなしではできない)を変更しようとしているときではなく、 'const char *'を設定して実際の 'const char'を実行し、' Init1'はそのアドレスの文字を変更しようとします。これは、引数が 'char **'なので完全に安全であるはずです。だから、これは安全ではありません。だから、コンパイラが不平を言うのです。 –

関連する問題