PATH в argv при запуске отладчика Visual Studio - PullRequest
0 голосов
/ 28 февраля 2019

Я запускаю программу на C ++ с argc и argv, когда я запускаю из командной строки, она передает 12 аргументов, имя exe и 11 других аргументов.я передаю тот же список аргументов в Visual Studio, например: ./euchre.exe pack.in shuffle 10 Alice Simple Bob Simple Cathy Simple Drew Simple

Однако при передаче той же вещи в списке аргументов в отладчике Visual Studio он также включает путь к файлу как argv в [0],сделать общее количество 13. Моя программа не принимает 13 аргументов, поэтому есть ли способ, которым я могу запретить VS использовать PATH в качестве аргумента?

EDIT: argv - это имя исполняемого файла с файлом PATH, к которому прикрепленимя исполняемого файла: path/to/file/euchre.exe необходимо убедиться, что PATH не присоединен к исполняемому файлу: ./euchre.exe, не уверен, есть ли способ сделать это

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Строго говоря, значение argv[0] определяется реализацией, хорошее объяснение см. В этом ответе .

Так что вам нужно перейти к документам Microsoft чтобы узнать, как это реализовано для Visual Studio.Чтобы процитировать соответствующий раздел:

Примечание

По соглашению argv [0] - это команда, с которой вызывается программа.Однако возможно порождать процесс с помощью CreateProcess, и если вы используете как первый, так и второй аргументы (lpApplicationName и lpCommandLine), argv [0] может не быть именем исполняемого файла;используйте GetModuleFileName для извлечения имени исполняемого файла и его полного пути.

По существу, значение argv[0] будет зависеть от того, как вызывается программа, и вы не можете реально контролировать, какотладчик вызовет вашу программу.

0 голосов
/ 28 февраля 2019

Согласно стандарту 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 ++ нет стандартного способа получить имя файла запущенного процесса.Вы должны полагаться на конкретный способ ОС, чтобы получить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...