Почему аргументы execv*() несовместимы с execl*()?

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

   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[]);

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам