代码之家  ›  专栏  ›  技术社区  ›  tssch

获取用户名的可移植方式

  •  4
  • tssch  · 技术社区  · 11 年前

    对于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 回复  |  直到 4 年前
        1
  •  4
  •   Mats Petersson    11 年前

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

    我将您的代码扩展为:

    #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上是否有一个有意义的用户)。

        2
  •  3
  •   David Jones Jake Shorty    5 年前

    没有可移植的解决方案。

    在Linux(以及一般的Unix)下,“用户”是一个数字,可以 有几个不同的名字。使用 getuid 那么要获取id getpwuid 得到其中一个名字。或使用 getlogin 得到 用户用于登录的名称(但只有在 过程具有控制终端)。如果你想得到 全部的 对于已知用户的名称,您必须进行迭代 使用 getpwent ,检查 pw_uid 每个条目的字段 返回。

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

    Windows有一个功能 GetUserName ; 我知道的不多 然而,关于它。

        3
  •  0
  •   mvw    11 年前

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

    由于周围有无数不同的系统,唯一可行的方法是将自己限制在想要支持的系统列表中。

    有一些软件可以帮助您实现可移植性,比如用于类Unix系统(以及在一定程度上的Windows)的GNU自动工具。

        4
  •  -1
  •   Michał Walenciak    11 年前

    你是对的——没有便携的方法可以做到这一点。 有两种解决方案:使用适当的ifdef集在windows上使用一个代码,在linux上使用另一个代码。

    另一种方法是使用factory,它会返回一个抽象对象或指向特定于系统的函数的指针。工厂应检测系统并返回正确的功能/类别