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

标签 c++ visual-studio debugging

我正在运行一个带有 argc 和 argv 的 C++ 程序,当我从命令行运行时,它传递了 12 个参数、exe 的名称和 11 个其他参数。例如,我在 visual studio 中传递了相同的 arguemnt 列表:./euchre.exe pack.in shuffle 10 Alice Simple Bob Simple Cathy Simple Drew Simple

然而,当在 Visual Studio 调试器的参数列表中传递相同的东西时,它还在 [0] 处将文件路径作为 argv 包括在内,使总数为 13。我的程序不假设有 13 个参数,所以是否有有什么方法可以防止 VS 使用 PATH 作为参数?

编辑:argv 是可执行文件名称,文件 PATH 附加到可执行文件名称:path/to/file/euchre.exe 需要确保 PATH 没有附加到 exe : ./euchre.exe,不确定是否有办法做到这一点

最佳答案

根据 C++ 标准,(if arc > 0) argv[0] 要么是空字符串,要么代表用于调用程序的名称。确切的表示形式未指定。

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

请注意,这两个标准都不能保证路径是相对路径,就像您希望的那样。

鉴于 argv[0] 是程序名称的某种表示形式的命令,如果您简单地向程序传递 11 个参数,那么将会有 argv[0]...argv[11]main 中总共有 12 个参数。如果您将 12 个参数传递给程序,那么 argv[0]...argv[12]main 中总共有 13 个参数>

Microsoft 文档说 argv[0]按照约定调用程序的命令。假设这个约定,你可以通过使用相对路径来执行程序来实现相对路径。我不知道是否可以配置 visual studio 调试器以使用工作目录的相对路径执行程序。

但是,最好不要让您的程序依赖于程序是使用相对路径(例如 ./filename.exe)还是使用绝对路径运行。依赖一个或另一个是一个糟糕的设计。例如,如果您需要可执行文件的名称而不需要包含它的目录,则可以在 argv[0] 上使用 std::filesystem::path::filename .无论路径是绝对路径还是相对路径,这都适用。

argv[0] 根本不是文件名的非常规情况下,上面的方法将不起作用。 C++ 中没有标准方法来获取正在运行的进程的文件名。您需要依靠特定于操作系统的方式来获取它。

关于c++ - 运行调试器 Visual Studio 时 argv 中的 PATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54930798/

相关文章:

visual-studio-2010 - 什么是第一次机会异常(exception)?

javascript - 确定错误是浏览器的错误还是我自己的错误的工作流程是什么?

c - Valgrind 错误根据输入而变化。如何解决?

C++ 内存管理技术/实践

c++ - STL_vector.h 的 GCC 4.1.2 编译错误

c# - 取消测试后清理

c# - Designer 在 InitializeComponent 中创建一些字段而不是创建全局变量

c++ - 多个容器和数据类型的模板函数

C++:对抗多态开销

c - gdb 查看核心转储中的结构值