4

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 に答える 4

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に意味のあるユーザーがいるかどうかはわかりません)。

于 2013-08-30T11:12:54.933 に答える
2

移植可能なソリューションはありません。

Linux (および一般的な Unix) では、「ユーザー」は数字であり、いくつかの異なる名前を持つことができます。を使用getuidして ID を取得し、次に getpwuid名前の 1 つを取得します。またはgetlogin、ユーザーがログインに使用した名前を取得するために使用します (ただし、これはプロセスに制御端末がある場合にのみ機能します)。ユーザーが知っているすべて の名前を取得したい場合は、 を使用して繰り返し、返された各エントリgetpwentのフィールドをチェックする必要があります。pw_uid

環境変数の使用は保証されていません。多くの場合、環境変数は設定されません。設定されていたとしても、それが正しいとは限りません。

Windows には機能がありますGetUserName。ただし、私はそれについてあまり知りません。

于 2013-08-30T11:27:27.037 に答える
1

ユーザーの概念は、言語ではなく、オペレーティング システムまたはシステムに関連しています。

無数の異なるシステムがあるため、実行可能な唯一のアプローチは、サポートしたいシステムのリストに限定することです。

Unix 系システム (およびある程度 Windows) 用の GNU autotools など、移植性を実現するのに役立つソフトウェアが存在します。

于 2013-08-30T11:13:15.657 に答える
-1

あなたは正しいです-それを行うポータブルな方法はありません。これには 2 つの解決策があります。適切な ifdef のセットを使用して、ウィンドウで 1 つのコードを使用し、Linux で別のコードを使用します。

もう1つの方法は、システム固有の抽象オブジェクトまたは関数へのポインタを返すファクトリで行うことです。工場はシステムを検出し、適切な関数/クラスを返す必要があります

于 2013-08-30T11:08:48.660 に答える