Program Arguments Handling in C++

A Complete Main

main() 函数作为我们的程序入口,我们可以在启动程序的时候传入许多参数。偷懒的 main() 写法是这样的,但这样,你不能从外界给你的程序传入参数:

int main(){

	return 0;
}

而如果你想在程序启动的时候传入数组参数,你可以使用如下的写法:

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

    return 0;
}

如果你的程序需要特定的环境才能运行,你还可以接受 envp 参数用于访问环境变量。但请注意,这并不属于 C++ 标准:

int main(int argc, char* argv[], char* envp[]) {

    return 0;
}

下面,我们就来逐步解释每个参数的含义。

Argument Count

argc 是传入参数的数量,这是隐式提供的。当程序启动时,操作系统会将传入字符串参数的数量隐式地提供给 main() 函数。假如我们将下面的程序编译并运行:

#include <iostream>
int main(int argc, char* argv[]
) {

    for (int i = 0; i < argc; ++i) {
        std::cout << "Argument " << i << ": " << argv[i] << std::endl;
    }
    return 0;
}
./test argv1 "hello world" # use "this is one string" to pass a string

提问,这里我们提供的参数数 argc 有多少个?答案是三个。观察输出结果:

Argument 0: ./test
Argument 1: argv[1]
Argument 2: hello world

Argument Vector

上面在学习 argc 的时候,我们实际上已经学到了 argv 。这是一个字符串参数列表,是这三个参数中我们唯一能够提供给程序的参数。其余的 argcenvp 都是操作系统隐式提供给 main() 函数的。

Environment

环境变量也是系统隐式提供的。通过获取环境变量,我们能够知道我们程序的运行环境。对于依赖某些环境才能运行的程序来说,获取环境变量可以帮助此程序动态地配置运行参数。此外,环境变量可能存储一些系统相关的信息,这对于跨平台的程序而言是极其重要的。

我们可以遍历打印所有的环境变量:

#include <iostream>

int main(int argc, char* argv[], char* envp[]) {
    for (int i = 0; envp[i] != nullptr; ++i) {
        std::cout << "Environment Variable " << i << ": " << envp[i] << std::endl;
    }
    return 0;
}

在 C++ 中,标准地获取环境变量的方式是 std::getenv