這是原型execv
:我可以傳遞一個const char *數組給execv嗎?
int execv(const char *path, char *const argv[]);
我可以通過作爲第二個參數的const char
指針的數組?
這個例子程序給出了當USE_CAST
未設置警告:
#include <unistd.h>
int main(int argc, char *argv[])
{
if (argc > 0) {
const char *exe_name = "/bin/echo", *message = "You ran";
const char *exe_args[] = { exe_name, message, argv[0], NULL };
#ifdef USE_CAST
execv("/bin/echo", (char **) exe_args);
#else
execv("/bin/echo", exe_args);
#endif
}
return 0;
}
編譯時,GCC說,「從傳遞兼容的指針類型‘execv’的論點2:」如果我不使用投。
從POSIX documentation爲execv
(中途理由部分),它看起來像第二個參數是爲了向後兼容一個char *const
數組:
約
argv[]
和envp[]
是常數包含的語句,以向未來的作者明確表示這些對象是完全不變的語言綁定。 ...不幸的是,第四列不能使用...
其中「第四列」是指const char* const[]
。
這個(char **)
可以放心使用嗎?我應該創建一個char *
數組並將其傳遞給execv
而不是?
不知何故,我認爲字符串文字是'const char'。我認爲,從我使用的變量中抽出「const」並不是那麼糟糕,儘管我開始認爲我誤解了常量的正確性,或者它在C中並不總是實際可行的。 – yellowantphil
@anaranjada ,不過,標準規定它們是'char'類型的數組,儘管在實踐中它們可能是不可寫的。 GCC可以選擇使用'const char'數組來替代,以幫助您找到試圖寫入其中的地方 - 也許這正是您想要的。 (因爲這個原因,當你啓用該選項時'gcc'不合格。) –
是的,我認爲GCC選項讓我失望。無論如何,我從代碼中刪除了一些'const'限定符,現在編譯時沒有警告。謝謝。 – yellowantphil