На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> argv[0]
    Всем привет!

    По Стандарту сабж в функции main заполняется либо именем исполняемого модуля (возможно с путем), либо пустой строкой. Собственно, вопрос: а в каких случаях он заполняется пустой строкой? Просто я с таким не встречался, но любопытно.
      Цитата JoeUser @
      Собственно, вопрос: а в каких случаях он заполняется пустой строкой?
      Может в случаях, когда он запускается под какой-нибудь совсем примитивной ОС в условиях ну очень сильно ограниченных ресурсов (типа на компе с объемом ОЗУ 16 К и загрузкой программы с перфокарт). Или на микроконтроллере, где эта программа - единственное, что он выполняет с момента включения питания и до выключения.
      Сообщение отредактировано: Dushevny -
        Стандартом эти условия не определяются, JoeUser. Просто если там не "", значит имя, использованное для запуска программы.
        Вероятно, можно предположить, что это определяется исполнительным окружением, но в Стандарте относительно argv[0] даже implementation-defined не сказано, так что хрен его там знает.
        Если ты о т.н. freestanding, Dushevny, то там вообще не обязательно должна быть какая-то там main(), а если и будет, то совсем не обязательно это будет именно та main(), что описана Стандартом.
          Цитата Qraizer @
          Стандартом эти условия не определяются, JoeUser

          Document Number: N3936
          Date: 2014-03-02
          Revises: N3797
          Reply to: Stefanus Du Toit
          Thalmic Labs
          cxxeditor@gmail.com
          Working Draft, Standard for Programming
          Language C++

          Цитата
          3.6.1 Main function
          ...
          as the type of main (8.3.5). In the latter form, for purposes of exposition, the first function parameter is
          called argc and the second function parameter is called argv, where argc shall be the number of arguments
          passed to the program from the environment in which the program is run. If argc is nonzero these arguments
          shall be supplied in argv[0] through argv[argc-1] as pointers to the initial characters of null-terminated
          multibyte strings (ntmbs s) (17.5.2.1.4.2) and argv[0] shall be the pointer to the initial character of a
          ntmbs that represents the name used to invoke the program or ""
          .
          ...

          Document Number: N4659
          Date: 2017-03-21
          Revises: N4640
          Reply to: Richard Smith
          Google Inc
          cxxeditor@gmail.com
          Working Draft, Standard for Programming
          Language C++

          Цитата
          6.6.1 main function
          ...
          as the type of main (11.3.5). In the latter form, for purposes of exposition, the first function parameter is
          called argc and the second function parameter is called argv, where argc shall be the number of arguments
          passed to the program from the environment in which the program is run. If argc is nonzero these arguments
          shall be supplied in argv[0] through argv[argc-1] as pointers to the initial characters of null-terminated
          multibyte strings (ntmbs s) (20.4.2.1.5.2) and argv[0] shall be the pointer to the initial character of a
          ntmbs that represents the name used to invoke the program or ""
          .
          ...
            Цитата Qraizer @
            Если ты о т.н. freestanding, Dushevny, то там вообще не обязательно должна быть какая-то там main(), а если и будет, то совсем не обязательно это будет именно та main(), что описана Стандартом.
            Тем не менее все компиляторы, с которыми я работал, используют main(argv, argc) и только один допускал main(void). А вот что они кладут в argv[0] проверять не было необходимости, а в выходном файле данные отсутствуют, потому каек не используются в программе.
              Цитата Dushevny @
              main(argv, argc)

              main(argc,argv) жи есть? ;)
                Цитата JoeUser @
                main(argc,argv) жи есть?
                Не понял вопроса. А, в смысле что я попутал порядок аргументов? Да, каюсь, виноват.
                Сделал тестовую программу, посмотрел листинг. argc, argv заполняются в cstartup перед вызовом main(). В проектах для контроллеров под gcc cstartup у меня самописный, поскольку argc, argv не использую - то и не заполняю. В реализации от STM32Cube они тоже не используются и не заполняются, а других компиляторов у меня не осталось. Увы, не помог.
                  Цитата Dushevny @
                  Увы, не помог.

                  Главное - озадачился и поучаствовал :)
                    Ребят, ещё раз: во freestanding всё кастомно, вплоть до сигнатуры и даже имени.
                      Вообще-то, полный прототип функции
                      int main(int argc, char *argv[], char* environ[])
                      Именно так размещает аргументы в стеке стандартный пусковой код. он же интерпретирует возвращённое значение, как код завершения.
                      Но поскольку main по стандарту связывается как функция C, последние аргументы можно безбоязненно удалять. Получается четыре варианта
                      int main(int argc, char *argv[], char* environ[])
                      int main(int argc, char *argv[])
                      int main(int argc)
                      int main()
                      Последний можно записать и как
                      int main(void)

                      Так обстоит дело на основных платформах, где аргументы располагаются в порядке от вершины стека вглубь (из-за чего заталкивать в стек их приходится в обратном порядке), а [целочисленный] результат возвращается в одном из регистров процессора.
                      На некоторых платформах такой способ передачи параметров может оказаться неудобным. Для них вышесказанное неприменимо.

                      Добавлено
                      Да, вариант с одним только счётчиком аргументов считается не используемым. Кого может интересовать количество аргументов без знания их самих?
                      Оба строковых массива [по стандарту] завершаются нулевым указателем, так что при анализе аргументов можно обойтись без argc.
                      Сообщение отредактировано: amk -
                        Цитата JoeUser @
                        Просто я с таким не встречался, но любопытно.

                        Могу предположить так: когда запуск идет стандартным образом, ОС все данные готовит по стандарту.
                        Но ничего не мешает, кому-то другому запускать приложения не используя возможности ОС (загрузить куда-то в память, настроить и запустить (передать управление в точке входа), и не соблюдать стандарт)
                          Цитата Black_Dragon @
                          ОС все данные готовит по стандарту
                          Обычно этим занимается стартовый блок самой программы. Хотя может для этого вызывать какие-то функции ОС.
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0328 ]   [ 16 queries used ]   [ Generated: 23.04.24, 17:55 GMT ]