我正在用argc和argv运行一个C ++程序,当我从命令行运行时,它将传入12个args,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作为参数的方法?
编辑:argv是可执行文件名,文件PATH附加到可执行文件名:path/to/file/euchre.exe
,需要确保PATH未附加到exe文件:./euchre.exe
,不确定是否存在是这样做的一种方式
答案 0 :(得分:1)
根据C ++标准,(如果arc > 0
)argv[0]
是一个空字符串,或者表示用于调用程序的名称。确切的表示方式未指定。
根据POSIX标准,argv[0]
中的值应该指向与exec函数之一正在启动的进程相关联的文件名字符串。
请注意,没有一种标准可以保证路径是相对路径,就像您希望的那样。
给出该命令argv[0]
是程序名称的某种表示,如果您仅将11个参数传递给程序,则将有argv[0]
... argv[11]
,即总共12个main
中的参数。如果您将12个参数传递给程序,则将有argv[0]
... argv[12]
,即main
Microsoft文档说argv[0]
是惯例用来调用程序的命令。假设采用此约定,则可以通过使用相对路径执行程序来获得相对路径。我不知道是否可以配置Visual Studio调试器以使用相对于工作目录的相对路径执行程序。
但是,最好不要让您的程序依赖于该程序是以相对路径(例如./filename.exe)还是绝对路径运行。依靠一个或另一个是不好的设计。例如,如果您需要可执行文件的名称而没有包含可执行文件的目录,则可以在std::filesystem::path::filename
上使用argv[0]
。无论路径是绝对路径还是相对路径,这都行得通。
在非常规情况下,argv[0]
根本不是文件名,上述方法不起作用。 C ++中没有标准方法来获取正在运行的进程的文件名。您需要依靠特定于操作系统的方式来获取它。
答案 1 :(得分:0)
严格来说,argv[0]
的值是实现定义的,请参见this answer以获得很好的解释。
因此,您需要转到Microsoft docs以了解如何为Visual Studio实现此功能。引用相关部分:
注意
按照惯例,argv [0]是程序所使用的命令 调用。但是,可以使用 CreateProcess,如果同时使用第一个和第二个参数 (lpApplicationName和lpCommandLine),argv [0]可能不是 可执行文件名称;使用GetModuleFileName检索可执行文件 名称及其完全限定的路径。
基本上,argv[0]
的值将取决于程序的调用方式,您实际上无法控制调试器如何调用程序。