这是一个基本问题,但也是一个重要的问题......
启动C++程序时,其主方法具有以下共同签名:
int main(int argc, char* args[]) { //Magic! return 0; }
是args [0]始终保证是当前正在运行的程序的路径?那么跨平台呢(因为我在Linux环境中,但可能稍后移植.)?
并非总是如此.这是您通过操作系统为程序提供的值.例如,使用启动程序时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
(用于获取当前工作目录,尝试使名称为绝对) .
在Windows上,GetModuleFileName保证了当前执行程序的确切完整路径.在linux上有一个符号链接/ proc/self/exe.在此符号链接上执行readlink以获取当前正在执行的程序的完整路径.即使youprogram被称为thorugh,symlink/proc/self/exe也总是指向actuall程序.