2012-05-28 2 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 Lion

+0

обугленного сопз * арг []? – 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 }; 

To:

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 };

для удобства у может сделает простой способ конвертировать.

+1

Вы имеете в виду, что я должен определить массив из 8-битных символов, чтобы поместить 64-битные указатели внутри? – Pietro

1

Единственная причина, по которой вы получаете предупреждение, заключается в том, что вы используете g ++, а не gcc. В чистом C вы не получите абсолютно никаких предупреждений. На самом деле довольно сложно создать код C++ без предупреждения. Честно говоря, я пробовал, но не добился успеха.

Эти препятствия являются одной из причин существования определенной философской школы. См. Больше here.

+0

После прочтения этого комментария Линуса Торвальдса на C++, я хотел бы помочь в матче между Торвальдсом и Страуступом. Я уверен, что будет много крови :-) За что я беспокоюсь, я никогда не вернусь из 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); 
} 

Это может быть чрезмерно многословным и раздражает, но предупреждения уходят.

Я бегу это на: г ++ (Ubuntu 4.8.4-2ubuntu1 ~ 14.04) 4.8.4

 Смежные вопросы

  • Нет связанных вопросов^_^