当前位置:  开发笔记 > 编程语言 > 正文

args [0]是否保证是执行的路径?

如何解决《args[0]是否保证是执行的路径?》经验,为你挑选了2个好方法。

这是一个基本问题,但也是一个重要的问题......

启动C++程序时,其主方法具有以下共同签名:

int main(int argc, char* args[]) {
    //Magic!
    return 0;
}

是args [0]始终保证是当前正在运行的程序的路径?那么跨平台呢(因为我在Linux环境中,但可能稍后移植.)?



1> Johannes Sch..:

并非总是如此.这是您通过操作系统为程序提供的值.例如,使用启动程序时exec可以将其设置为任意值:

int execve(const char *filename, char *const argv[],
           char *const envp[]);

第一个参数是要启动的文件,argv将包含argv [0]和main的所有其他参数.envp包含环境变量(未由标准C或C++定义.这是posix事物).

更准确地说,这是C++中argv的定义:

实现不应预定义主函数.此功能不应过载.它应该具有int类型的返回类型,否则其类型是实现定义的.所有实现都应允许以下两个主要定义:

int main() { /* ... */ }

int main(int argc, char* argv[]) { /* ... */ }

在后一种形式中,argc应该是从运行程序的环境传递给程序的参数数量.如果的argc是非零这些参数应被供应argv[0]通过 argv[argc-1]作为指针指向空终止多字节串的初始字符(NTMBSs)(17.3.2.1.3.2)和argv[0]应为指针NTMBS的初始字符表示所用的名称调用程序或"".argc的值应为非负值.值 argv[argc]应为0. [注意:建议在argv之后添加任何其他(可选)参数.]

它几乎取决于定义"用于调用程序的名称"的实现.如果要获取可执行文件的完整路径,可以在Windows上使用GetModuleFileName,并且argv[0](用于获取用于执行的名称,可能是相对的)以及getcwd(用于获取当前工作目录,尝试使名称为绝对) .



2> Tim Matthews..:

在Windows上,GetModuleFileName保证了当前执行程序的确切完整路径.在linux上有一个符号链接/ proc/self/exe.在此符号链接上执行readlink以获取当前正在执行的程序的完整路径.即使youprogram被称为thorugh,symlink/proc/self/exe也总是指向actuall程序.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有