2012-05-28 8 views
3

이 코드는 작동하지만, 나는 수정하려는 경고를 얻을 :경고없이 execv()를 사용하는 방법?

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

경고 : 나는에 대한 경고를하지 않을 '의 char *'

상수 문자열에서 변환되지 않습니다 억압 당하고 싶지 않다. C가 아닌 C++ 코드입니다.

char * const (execv()에서 요구하는 것과 정확히 일치하므로)를 사용하면 경고 메시지가 계속 나타납니다.

감사합니다.

컴파일러 : GCC 4.2 - 언어의 최신 버전이 허용되지 않습니다 맥 OS-X 라이온

+0

의 char const를 * 인수 [] :

나는이에를 실행하는거야? – 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

경고를받는 유일한 이유는 gcc가 아니라 g ++를 사용하고 있기 때문입니다. 순수한 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); 
} 

또는

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

그것은 지나치게 자세한 성가신 수 있습니다

하지만 경고가 사라집니다.g ++ (우분투 4.8.4-2ubuntu1 ~ 14.04) 4.8.4

관련 문제