Согласно стандарту C ++ (если arc > 0
) argv[0]
является либо пустой строкой, либо представляет имя, используемое для вызова программы.Точное представление не указано.
В соответствии со стандартом POSIX значение в argv[0]
должно указывать на строку имени файла, связанную с процессом, запускаемым одной из функций exec.
Обратите внимание, что ни одна из стандартных гарантий не гарантирует, что путь является относительным, как вы этого хотели бы.
Учитывая, что команда argv[0]
представляет собой некоторое представление имени программы, если выпросто передайте 11 аргументов программе, тогда будет argv[0]
... argv[11]
, т.е. всего 12 аргументов в main
.Если вы передадите в программу 12 аргументов, то будет argv[0]
... argv[12]
, то есть всего 13 аргументов в main
Документация Microsoft гласит, что argv[0]
это по соглашению команда, с которой вызывается программа.Принимая это соглашение, вы можете получить относительный путь, используя относительный путь для выполнения программы.Я не знаю, можно ли настроить отладчик Visual Studio для выполнения программы с относительным путем к рабочему каталогу.
Однако вместо этого было бы предпочтительным не допустить, чтобы ваша программа зависела от того, была ли программа запущена с относительным путем (например, ./filename.exe), или с использованием абсолютного пути.Это плохой дизайн, чтобы полагаться на один или другой.Например, если вам нужно имя исполняемого файла без каталога, в котором оно находится, вы можете использовать std::filesystem::path::filename
для argv[0]
.Это работает независимо от того, является ли путь абсолютным или относительным.
В нетрадиционном случае, когда argv[0]
вообще не является именем файла, описанное выше не будет работать.В C ++ нет стандартного способа получить имя файла запущенного процесса.Вы должны полагаться на конкретный способ ОС, чтобы получить его.