Для 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 …
Нет портативного решения.
Под Linix (и Unix в целом) «пользователь» — это число, которое может
есть несколько разных имен. использование getuid
чтобы получить идентификатор, тогда
getpwuid
чтобы получить одно из имен. Или использовать getlogin
получить
имя, которое пользователь использовал для входа (но это будет работать только если
процесс имеет управляющий терминал). Если вы хотите получить все
из имен, под которыми пользователь известен, вам придется повторить
с помощью getpwent
, проверяя pw_uid
поле для каждой записи
вернулся.
Использование переменной среды не гарантировано. Во многих
контекстах, переменная окружения не будет установлена, и даже если она
это не гарантируется, чтобы быть правильным.
У Windows есть функция GetUserName
; Я не слишком много знаю
об этом, однако.
Использование переменных окружения для поиска имени пользователя очень ненадежно:
Я расширил ваш код до этого:
#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 есть значимый пользователь).
Концепция пользователя связана с операционной системой или даже системой, а не с языком.
Поскольку существует множество различных систем, единственный выполнимый подход — ограничиться списком систем, которые вы хотите поддерживать.
Существует программное обеспечение, которое может помочь вам добиться переносимости, например, автоинструменты GNU для Unix-подобных систем (и в некоторой степени Windows).
Вы правы — нет портативного способа сделать это.
Для этого есть два решения: использовать надлежащий набор ifdef для использования одного кода в окне, а другого в linux.
Другой способ — сделать это с фабрикой, которая вернет вам абстрактный объект или указатель на функцию, которая будет зависеть от конкретной системы. Фабрика должна обнаружить систему и вернуть правильную функцию / класс