2015-01-29 3 views
4

Зачем нужны аргументы argv для семейства execv*()char * const [], а execl*() - arg0...n - const char *? Это просто ошибка в стандарте, и она должна быть const char * const [] или есть причина, по которой строки не будут const-константами в случае массива, но const в случае явно переданных аргументов?Почему аргументы execv *() несовместимы с execl *()?

int execl(const char *path, const char *arg0, ... /*, (char *)0 */); 
    int execv(const char *path, char *const argv[]); 
    int execle(const char *path, const char *arg0, ... /*, 
      (char *)0, char *const envp[]*/); 
    int execve(const char *path, char *const argv[], char *const envp[]); 
    int execlp(const char *file, const char *arg0, ... /*, (char *)0 */); 
    int execvp(const char *file, char *const argv[]); 

ответ

0

Я не могу найти авторитетный ответ, но я подозреваю, что две подписи вызова различаются в зависимости от того, как они создаются и как они используются.

В случае execl*(), вполне возможно, что ваша функция прошла мимо const char*, которую вы передаете. Если подпись execl*() не была const char*, то вы получили бы предупреждения о компиляторе.

В случае execv*(), так как это массив, который, вероятно, был построен вами, поддерживать постоянство строкового значения не так важно. НО важно то, что execv*() не манипулирует указателями - в противном случае возможно, что последний элемент может быть изменен, чтобы он больше не правильно указывал на NULL - что требуется.

Возможно, кто-то с более близким знакомством спецификации, чтобы уточнить, где я, возможно, ошибся.

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