2013-10-21 86 views
13

我不知道是否有在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::stringto_cstr()方法,它返回const char *

看起來好像execvp真的應該採取const char *const argv[],換句話說,它應該承諾不做任何上述改變。

+2

爲什麼它已被遷移,如果它已經有一個可接受的答案? – haccks

+0

因爲它屬於這裏。 – Wug

回答

9

引述你鏈接的頁面:

argv[]envp[]是常數被列入到 聲明作出明確語言綁定的未來的作家,這些 對象是完全不變。由於ISO C 標準的限制,這是不可能地指出想法標準C. 指定的const兩級 - 資格的argv[]envp[]參數exec函數可能看起來是自然 選擇,因爲這些函數不會修改 指針數組或該函數指向的字符,但這個 會禁止現有的正確代碼。

基本上上execlpexecvp和所述const資格是在這個意義上,它們指定在對應的參數相同的限制完全兼容。

+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)對我來說是非常令人驚訝的。我沒有意識到在C中不可能用'char * const *'初始化一個'const char * const *'。這在C++中正常工作。我真的不明白爲什麼。爲什麼C認爲這兩種類型不兼容? –

相關問題