Использование NSUserName () на C - PullRequest
0 голосов
/ 30 ноября 2011

Я пытаюсь прочитать имя пользователя через NSUserName().Я попробовал следующий код:

#include <stdio.h>
#include <Foundation/Foundation.h>

int main()
{
    NSString *userName = NSUserName();

    printf("username %ls\n", userName);

    return 0;
}

и скомпилировал его с помощью:

gcc -o username -framework Foundation username.c

Несколько вещей:

1- #include <Foundation/Foundation.h> генерируетмного ошибок.2. Как я могу преобразовать NSString в char*

на 1 Я добавляю ключ -framework в GCC, но я думаю, что Foundation.h не готов к C?И на 2 я попытался установить char *userName = NSUserName();, но это не был способ сделать это.

Есть идеи?Код должен быть C, а не target-C (как гласит заголовок)

Спасибо!

Ответы [ 3 ]

3 голосов
/ 01 декабря 2011

Вот чистый C, эквивалентный NSUserName():

#include <pwd.h>
#include <unistd.h>

...

struct passwd *pwent = getpwuid(getuid());
printf("Username: %s\n", pwent->pw_name);

В качестве бонуса, он будет компилироваться и работать на всех операционных системах на основе UNIX (например, Linux), а не только на Mac OS X.

0 голосов
/ 01 декабря 2011

Я не понимаю, почему вы хотите это сделать.В OS X есть способ получить ту же информацию из C, и это getlogin().

Foundation - это среда Objective-C, а NSString - класс Objective-C.Вызвать его без использования Objective-C - непростая задача.По сути, вам нужно будет связать в Foundation, включить objc / objc.h для id, прототип NSUserName() самостоятельно, использовать API времени выполнения Objective C, чтобы получить селектор для UTF8String, использовать API времени выполнения Objective Cотправить сообщение в строку, а затем распечатать результат.

Все это, чтобы избежать вызова getlogin().

0 голосов
/ 30 ноября 2011

измените расширение файла, содержащего ваш код, с .c на .m, и я готов поспорить, что у вас будет лучший опыт компиляции.

На моей машине, когда я уроню ваш код в файлс именем "MrAleph.m", вот что я получаю:

[/tmp]:;gcc -o test -framework Foundation MrAleph.m
MrAleph.m: In function ‘main’:
MrAleph.m:8: warning: format ‘%ls’ expects type ‘wchar_t *’, but argument 2 has type ‘struct NSString *’
MrAleph.m:8: warning: format ‘%ls’ expects type ‘wchar_t *’, but argument 2 has type ‘struct NSString *’

И чтобы исправить эти предупреждения, просто измените одну строку кода на:

printf("username %s\n", [userName UTF8String]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...