:に合わせて表示され、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[]);
execlp
はconst 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::string
のto_cstr()
方法を使用して、execvpのコールする(技術的には、禁止)それは難しいことができます。
execvp
は本当にconst char *const argv[]
を取るべきです、言い換えれば、上記の変更のいずれもしないことを約束する必要があります。あなたがリンクページ引用する
まだ受け入れられている回答があれば、移行されるのはなぜですか? – haccks
ここに属しているので。 – Wug