2013-10-21 4 views
13

:に合わせて表示され、Linuxのmanページから抜粋`execvp`が` char * const argv [] `を使うのはなぜですか?これはシングルUnixの仕様では、単にバグである場合の<code>const</code> -nessが異なる2つのexec関数の間に理由がある場合、私は思ったんだけど

Single Unix Specificationは、ここでexecの2つのバージョンがあります:

int execlp(const char *file, const char *arg, ...);
int execvp(const char *
file, char *constargv[]);

execlpconst char *としてその引数を取り、そしてそれはそれらの2つ以上を要します。 constは、この関数が指し示すデータを変更しないことを約束しています。この場合は、文字列を構成する実際の文字(char)です。

execvpは、その引数をポインタの配列として取ります。しかし、const char *へのポインタの配列の代わりに、constのキーワードは別の場所にあります。これはCにとってかなり重要です。execvpは文字列の文字をうまく変更する可能性があると言っていますが、約束しています配列を変更しないでください。つまり、文字列へのポインタです。だから、他の言葉で、特に

int fake_execvp(const char *file, char *const argv[]) { 
    argv[0] = "some other string"; /* this is an error */ 
    argv[0][0] = 'f';    /* change first letter to 'f': this is perfectly OK! */ 
    /* ⋮ */ 
} 

が、これはconst char *を返すC++のstd::stringto_cstr()方法を使用して、execvpのコールする(技術的には、禁止)それは難しいことができます。

execvpは本当にconst char *const argv[]を取るべきです、言い換えれば、上記の変更のいずれもしないことを約束する必要があります。あなたがリンクページ引用する

+2

まだ受け入れられている回答があれば、移行されるのはなぜですか? – haccks

+0

ここに属しているので。 – Wug

答えて

9

argv[]envp[]ている定数の文が に含まれている

は、これらの のオブジェクトが完全に一定である言語バインディングの将来作家に明示します。 execの機能のためのargv[]envp[]パラメータのための資格自然 選択であるように見えるかもしれません - によりISO C 標準の制限のために、const次の2つのレベルを指定すると、標準のC. にその考えを述べることはできませんこれらの関数は、 ポインタの配列または関数が指す文字を変更しませんが、この は既存の正しいコードを許可しません。

基本的execlpexecvpconst資格は、それらが対応する引数に同じ制限を指定するという意味で完全に互換性があります。

+0

*(編集:これを無視してください。私のポイントは[この質問]で既に直接議論されています(http://stackoverflow.com/questions/3496000/why-is-it-not-ok-to-pass-char-to -a-function-that-takes-a-const-char-in?rq = 1))。* リンク先ページ[1](http://pubs.opengroup.org/onlinepubs /9699919799/functions/fexecve.html)は私にとって非常に驚きです。私は 'const char * const *'を 'char * const *'で初期化することができないことをC言語では認識していませんでした。これはC++でうまく動作します。なぜ私は本当に見ることができません。 Cはこれらの2つのタイプが互換性がないと考えているのはなぜですか? –

関連する問題

 関連する問題