Использование строковых литералов здесь совершенно нормально.
Независимо от того, указывает ли аргумент указателя (или данные указателя, на который указывает аргумент) на константный тип, не имеет ничего общего с тем, может ли функция изменять указательдля объекта.Это чисто вопрос контракта рассматриваемой функции.Как правило, обычно предпочтительнее использовать указатели с константным указателем в аргументах, когда объект не будет изменен:
- , чтобы разрешить передачу указателей на объекты с константным уточнением без приведения, и
- как указание на то, что объект не будет изменен.
, но это не требуется для языка Си.А для функций, которые используют типы двойных указателей в своих интерфейсах, здесь часто есть компромисс.Поскольку T *
и const T *
не могут использовать псевдонимы друг друга, интерфейс должен выбирать форму, более подходящую для вызывающей стороны;если вызывающая сторона хочет другую форму, она должна сделать временную копию для передачи в функцию.Это относится к posix_spawn
.
. В общем, когда речь идет о стандартных функциях (C или POSIX), они не могут иметь каких-либо наблюдаемых побочных эффектов, кроме указанных .Если ОПИСАНИЕ для функции не документирует, что она изменит объект, «принадлежащий» приложению, или к которому приложение имеет доступ, оно не сможет изменить его;это не соответствует.Вот почему функции, которые возвращают указатели на статическое хранилище, явно документируют это.Например, документы POSIX для strerror
:
Возвращенный указатель строки может быть недействительным или содержимое строки может быть перезаписано последующим вызовом strerror (),
За исключением такой документации, приложение может предположить, что строка, возвращаемая strerror
, никогда не изменяется реализацией.
Поскольку posix_spawn
не задокументировано для изменения строк, на которые указывает массив argv
, он не изменяет их.
Кроме того, обратите внимание, что posix_spawn
должен быть поточно-ориентированным и не накладывает никаких явных ограничений на приложения для одновременного доступа к строкам argv
.Таким образом, любая модификация привела бы к гонкам данных, что сделало бы posix_spawn
не поточно-безопасным, вопреки спецификации.