获取用户名的便携方式

时间:2013-08-30 11:02:12

标签: c++ portability username getenv

对于C / C ++,似乎没有可移植的函数来获取Linux / Posix和Windows中的用户名。 实现这一目标的最简单但最强大的便携式代码是什么?

在Linux中,似乎总是定义USER环境变量,而Windows似乎定义了USERNAME变量。依赖于getenv可以避免包含windows.h并最小化预处理器语句:

char * user_name = getenv("USER");
if (!user_name) {
     user_name = getenv("USERNAME");
}

但这种方法是否有点稳健?或者我对另一种解决方案一无所知?我对iOS也一无所知......

4 个答案:

答案 0 :(得分:4)

使用环境变量查找用户名是非常不可靠的:

我将您的代码扩展为:

#include <iostream>

int main()
{
    char * user_name = getenv("USER");
    std::cout << user_name << std::endl;
}

并且这样做了:

$ whoami
MatsP
$ g++ -Wall -std=c++0x getenv.cpp 
$ ./a.out
MatsP
$ export USER=DonaldDuck
$ ./a.out
DonaldDuck

所以,我肯定会建议如果用户名对你的代码有任何重要性,那么你应该使用系统特定的函数来获取用户名。如果它对您的代码不重要,请在安装时或其他类似问题,并且不要尝试使用任何系统函数来获取用户名。

(回答你的实际问题,是的,我认为iOS具有USER环境变量的相同功能 - 尽管我不确定iPhone上是否有有意义的用户)。

答案 1 :(得分:2)

没有便携式解决方案。

在Linux(和一般的Unix)下,“用户”是一个数字,而且可以 有几个不同的名字。然后使用getuid获取ID getpwuid获取其中一个名称。或者使用getlogin来获取 用户登录时使用的名称(但这仅适用于 过程有一个控制终端)。如果你想获得所有 对于用户所知的名称,您必须进行迭代 使用getpwent,检查每个条目的pw_uid字段 返回。

使用环境变量保证。在很多 上下文,环境变量将不会被设置,即使它 是的,它不能保证是正确的。

Windows有一个函数GetUserName;我不太了解 然而,关于它。

答案 2 :(得分:1)

用户概念与操作系统甚至系统有关,而与语言无关。

由于存在大量不同的系统,唯一可行的方法是将自己限制在您想要支持的系统列表中。

存在可以帮助您实现可移植性的软件,例如用于Unix系统的GNU autotools(以及某种程度上的Windows)。

答案 3 :(得分:-1)

你是对的 - 没有可移植的方法来做到这一点。 有两种解决方案:使用正确的ifdef集合在窗口上使用一个代码,在Linux上使用另一个代码。

另一种方法是使用工厂来做它,它会返回一个抽象对象或指向函数的指针,这将是系统特定的。工厂应该检测系统并返回适当的功能/类