这是一个基本问题,但也是一个重要问题......
启动主要方法具有以下共同签名的C ++程序时:
int main(int argc, char* args[]) {
//Magic!
return 0;
}
是否始终保证args [0]成为当前正在运行的程序的路径?那么跨平台呢(因为我在Linux环境中,但稍后可能会移植。)?
答案 0 :(得分:21)
并非总是如此。这是您通过操作系统为程序提供的值。例如,使用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]
作为指向以null结尾的多字节字符串(NTMBS)的初始字符的指针 (17.3.2.1.3.2)和argv[0]
应该是表示NTMBS的初始字符的指针,代表 用于调用程序的名称或“”。 argc的值应为非负值。的价值argv[argc]
应为0. [注意:建议在之后添加任何其他(可选)参数 argv的。 ]
这几乎取决于定义“用于调用程序的名称”的实现。如果要获取可执行文件的完整路径,可以在Windows上使用GetModuleFileName,并使用argv[0]
(用于获取用于执行的名称,可能是相对的)以及getcwd
(获取当前工作目录,尝试将名称设为绝对名称。
答案 1 :(得分:5)
没有。在Windows上,GetModuleFileName保证了当前执行程序的确切完整路径。在linux上有一个符号链接/ proc / self / exe。在此符号链接上执行readlink以获取当前正在执行的程序的完整路径。即使youprogram被称为thorugh,symlink / proc / self / exe将始终指向实际程序。
答案 2 :(得分:3)
学生过去常常试图通过编写可以用“cc”或“tcsh”的argv [0]启动它的C程序来隐藏他们在学校大型机上玩Rogue的事实。
答案 3 :(得分:2)
以下是C标准所说的argv[0]
应该是:
如果
argc
的值大于。{ 零,指向的字符串argv[0]
代表程序名称;argv[0][0]
应为空 如果程序名称不是,则为字符 可从主机环境获得。
至于它是否包含完整路径,答案是argv [0]不一定包含可执行文件的完整路径。在Windows上,它似乎正是命令行上提供的内容。 Dunno Linux / Unix的功能。