对于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也一无所知......
答案 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上使用另一个代码。
另一种方法是使用工厂来做它,它会返回一个抽象对象或指向函数的指针,这将是系统特定的。工厂应该检测系统并返回适当的功能/类