在C++程序开发中,获取当前登录用户名是一个比较常见的需求,无论是做用户数据隔离、权限控制还是日志记录,都可能需要用到这个基础信息,不同操作系统对应的系统接口存在差异,需要根据实际运行环境选择对应的实现方式。

Windows系统下的实现方法
Windows系统提供了专门的API函数来获取当前用户信息,核心使用的是GetUserName函数,该函数属于Windows API的一部分,需要包含对应的头文件并链接对应的库。
实现步骤
- 包含必要的头文件
windows.h - 定义存储用户名的字符数组
- 调用
GetUserName函数获取信息 - 处理返回结果判断获取是否成功
代码示例
#include <windows.h>
#include <iostream>
#include <string>
// 获取Windows系统当前登录用户名
std::string GetWindowsUserName() {
char username[256];
DWORD username_len = sizeof(username);
// 调用系统接口获取用户名
if (GetUserName(username, &username_len)) {
return std::string(username);
} else {
// 获取失败返回空字符串
return "";
}
}
int main() {
std::string name = GetWindowsUserName();
if (!name.empty()) {
std::cout << "当前登录用户名:" << name << std::endl;
} else {
std::cout << "获取用户名失败" << std::endl;
}
return 0;
}
Linux系统下的实现方法
Linux系统下获取当前登录用户名可以使用getlogin函数,或者读取环境变量LOGNAME、USER,其中getlogin是标准库提供的接口,实现更稳定。
实现步骤
- 包含必要的头文件
unistd.h和stdlib.h - 调用
getlogin函数获取用户名 - 判断返回结果是否有效
代码示例
#include <unistd.h>
#include <stdlib.h>
#include <iostream>
#include <string>
// 获取Linux系统当前登录用户名
std::string GetLinuxUserName() {
char* login_name = getlogin();
if (login_name != nullptr) {
return std::string(login_name);
} else {
// 如果getlogin失败,尝试读取LOGNAME环境变量
char* env_name = getenv("LOGNAME");
if (env_name != nullptr) {
return std::string(env_name);
}
return "";
}
}
int main() {
std::string name = GetLinuxUserName();
if (!name.empty()) {
std::cout << "当前登录用户名:" << name << std::endl;
} else {
std::cout << "获取用户名失败" << std::endl;
}
return 0;
}
跨平台兼容实现方案
如果程序需要同时运行在Windows和Linux系统上,可以通过宏定义区分不同的操作系统,分别调用对应的系统接口,实现一套代码兼容多平台。
#include <iostream>
#include <string>
#ifdef _WIN32
#include <windows.h>
std::string GetCurrentUserName() {
char username[256];
DWORD username_len = sizeof(username);
if (GetUserName(username, &username_len)) {
return std::string(username);
}
return "";
}
#elif __linux__
#include <unistd.h>
#include <stdlib.h>
std::string GetCurrentUserName() {
char* login_name = getlogin();
if (login_name != nullptr) {
return std::string(login_name);
}
char* env_name = getenv("LOGNAME");
if (env_name != nullptr) {
return std::string(env_name);
}
return "";
}
#else
std::string GetCurrentUserName() {
return "";
}
#endif
int main() {
std::string name = GetCurrentUserName();
if (!name.empty()) {
std::cout << "当前登录用户名:" << name << std::endl;
} else {
std::cout << "获取用户名失败" << std::endl;
}
return 0;
}
注意事项
- Windows下调用
GetUserName需要保证程序有足够的权限,部分受限环境下可能无法获取 - Linux下
getlogin在无控制终端的场景下会返回空,此时可以 fallback 到读取环境变量 - 获取的字符串编码在不同系统下可能有差异,如果是中文用户名需要注意编码转换问题
- 存储用户名的缓冲区大小要足够,避免缓冲区溢出导致程序异常
C++获取当前登录用户名系统接口用户信息Windows_API修改时间:2026-06-25 14:03:47