运行调试器Visual Studio时argv中的PATH

时间:2019-02-28 17:03:28

标签: c++ visual-studio debugging

我正在用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,不确定是否存在是这样做的一种方式

2 个答案:

答案 0 :(得分:1)

根据C ++标准,(如果arc > 0argv[0]是一个空字符串,或者表示用于调用程序的名称。确切的表示方式未指定。

根据POSIX标准,argv[0]中的值应该指向与exec函数之一正在启动的进程相关联的文件名字符串。

请注意,没有一种标准可以保证路径是相对路径,就像您希望的那样。

给出该命令argv[0]是程序名称的某种表示,如果您仅将11个参数传递给程序,则将有argv[0] ... argv[11],即总共12个main中的参数。如果您将12个参数传递给程序,则将有argv[0] ... argv[12],即main

中有13个参数

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]的值将取决于程序的调用方式,您实际上无法控制调试器如何调用程序。