2012-05-28 39 views
3

此代碼的工作,但我得到一個警告,我想修復:如何在沒有警告的情況下使用execv()?

#include <unistd.h> 
main() 
{ 
    char *args[] = {"/bin/ls", "-r", "-t", "-l", (char *) 0 }; 
    execv("/bin/ls", args); 
} 

警告:棄用從字符串常量「字符*」

轉換我不想警告被壓制,我不想擁有它。 它是C++代碼,而不是C.

使用char * const(所以execv()所需的類型仍然會產生警告。

謝謝。

編譯器:GCC 4.2 - 的MacOS-X獅子

+0

字符常量* ARGS []? – bmargulies

+0

這給出了一個錯誤,而不是一個警告。 – Pietro

回答

4

這似乎是確定:

#include <unistd.h> 
main() 
{ 
    char const *args[] = {"/bin/ls", "-r", "-t", "-l", NULL }; 
    execv("/bin/ls", const_cast<char**>(args)); 
} 
+0

這顯示警告當我運行它。 – Ethan

0

要轉換一個字符串常量一個可變的字符指針,使用隱式轉換改變,編譯器警告您的語言的新版本將不會允許這種投。

當定義一個字符串litteral C++理解它意味着你將它定義爲一個可變的字符陣列的恆定字符數組,相應地更改代碼。

+0

awiebe:「你正在轉換一個字符串常量」。 char * args []不是常量。 – Pietro

1

變化:

char *args[] = {"/bin/ls", "-r", "-t", "-l", (char *) 0 }; 

要:

char *const args[] = {"/bin/ls", "-r", "-t", "-l", NULL }; 
+0

我不斷收到相同的警告。 – Pietro

0

變化

char *args[] = {"/bin/ls", "-r", "-t", "-l", (char *) 0 };

char args[] = {(char*)"/bin/ls", (char*)"-r", (char*)"-t", (char*)"-l", 0 };

可用性U可以將做一個簡單的轉換方法。

+1

你的意思是我應該定義一個8位字符的數組,並在裏面放置64位指針? – Pietro

1

你得到警告的唯一原因是你使用的是g ++而不是gcc。在純粹的C中,你絕對不會有任何警告。 實際上很難從此創建無警告的C++代碼。說實話,我嘗試過但沒有成功。

這些障礙都是原因進行了某些哲學學派的存在之一。查看更多here

+0

在閱讀Linus Torvalds在C++上的評論後,我想協助Torvalds和Stroustrup之間的比賽。我確信會有很多血:-)對於我所關心的,我永遠不會從std :: vector回到malloc! – Pietro

1

我不知道爲什麼選擇了接受的答案,當我運行這段代碼不會刪除任何警告....

我不能在您的特定平臺上確認,但加入石膏每個字符串常量有警告消失了。

#include <unistd.h> 
main() 
{ 
    char* const args[] = {(char*)"/bin/ls", (char*)"-r", (char*)"-t", (char*)"-l", (char*) 0 }; 
    execv("/bin/ls", args); 
} 

OR

#include <unistd.h> 
main() 
{ 
    char *args[] = {(char*)"/bin/ls", (char*)"-r", (char*)"-t", (char*)"-l", (char*) 0 }; 
    execv("/bin/ls", args); 
} 

這可能是過於冗長和煩人,但警告消失。

我運行此上:克++(Ubuntu的4.8.4-2ubuntu1〜14.04)4.8.4

相關問題