我不知道是否有在const
-ness不同的兩個執行函數之間的一個原因,如果這僅僅是在單一Unix規格中的錯誤:從Linux手冊頁,這似乎與對齊摘編爲什麼`execvp`採用`char * const argv []`?
Single Unix Specification,這裏是一個exec
兩個版本:
int execlp(const char *file, const char *arg, ...);
int execvp(const char *file, char *constargv[]);
execlp
接受它的參數作爲const char *
,它需要兩個或更多的人。 C中的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! */
/* ⋮ */
}
特別地,這使得它很難(技術上,禁止)來調用execvp使用C++的std::string
的to_cstr()
方法,它返回const char *
。
看起來好像execvp
真的應該採取const char *const argv[]
,換句話說,它應該承諾不做任何上述改變。
爲什麼它已被遷移,如果它已經有一個可接受的答案? – haccks
因爲它屬於這裏。 – Wug