(1) locale.h 文件不同
#include
C语言支持本地化设定,如本地格式时间和货币符号
C格式是最小化的设定格式,在所有的系统和编译器中有通用的相同设定,因此使用这种格式编写的程序是可预测的。是所有C语言程序默认使用的格式。
系统的默认格式使用空字符串””格式。当程序运行时,环境提供默认的本地化配置,通常包含比C格式的更多的本地化信息。
头文件中定义lconv类型,函数setlocale和localeconv,结合一些宏,定义本地特定信息。
注意本地配置信息影响这标准C函数库中的很多函数的行为:
或,字符转换规则影响strcoll和strxfrm函数
或,扩展字符集选择影响了isdigit和isxdigit函数以外,其他函数
或,字符转换规则影响格式化的输入/输出操作和小数点字符集影响数字格式化
或,时间的本地化格式影响strftime函数
一些本地化信息能够更好的渲染程序的输出。
头文件中的结构类型:
lconv:数值的格式化信息
头文件中提供了一些函数
setlocale:设置或恢复本地化信息
localeconv:获得本定格式化信息 返回lconv结构指针
lconv结构介绍
保存格式化的数值信息,保存数值包括货币和非货币的格式化信息,localeconv返回指向该对象的指针,以下为结构中的成员及信息:
char
*decimal_point; char
*thousands_sep; char *grouping; char
*int_curr_symbol; char
*currency_symbol; char *mon_decimal_point; char *mon_thousands_sep; char
*mon_grouping; char
*positive_sign; char
*negative_sign; char
int_frac_digits; char
frac_digits; char
p_cs_precedes; char
p_sep_by_space; char
n_cs_precedes; char
n_sep_by_space; char
p_sign_posn; char
n_sign_posn; 函数:
struct lconv * localeconv(void)
返回指向当前lconv对象的指针,包含本地化信息
char * setlocale(int category,const char * locale);
设定或恢复本地化配置
很多运行环境包含着用户的本地化信息,独立于系统之外,所有的C程序采用C本地化格式,为了使用本地环境的配置信息,调用该函数,采用“”为函数参数。
C的本地化格式的设定形式为:setlocale(LC_ALL,”C”)
默认的本地化格式:setlocale(LC_ALL,””);
参数:
category:以下参数为定义在中的宏
名称
影响部分
LC_ALL
全部本地化信息
LC_COLLATE
影响strcoll和strxfrm
LC_CTYPE
影响字符处理函数和多行字符处理函数
LC_MONETRAY
影响localeconv返回的货币格式化信息
LC_NUMERIC
影响格式化输入输出字符中的小数点符号
LC_TIME
影响strftime函数
Locale:
若为“C”,则为C本地化方式,若为“”,则采用当前环境下的默认本地化格式
参考:http://www.cplusplus.com/reference/clibrary/clocale/
http://edu.codepub.com/2009/1023/16664.php
以下为 Android NDK 编译 Glib
时报的错误:gstrfuncs.c: In function 'g_ascii_strtod':
gstrfuncs.c:710:30: error: 'struct lconv' has no member named
'decimal_point' gstrfuncs.c: In function 'g_ascii_formatd':
gstrfuncs.c:934:30: error: 'struct lconv' has no member named
'decimal_point'
make[4]: *** [gstrfuncs.lo] Error 1
make[4]: Leaving directory
`/home/yujinhe/projects/NDK/jni/glib-2.32.4/glib'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory
`/home/yujinhe/projects/NDK/jni/glib-2.32.4/glib'
make[2]: *** [all] Error 2
make[2]: Leaving directory
`/home/yujinhe/projects/NDK/jni/glib-2.32.4/glib'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory
`/home/yujinhe/projects/NDK/jni/glib-2.32.4'
make: *** [all] Error 2
yujinhe@ubuntu:~/projects/NDK/jni/glib-2.32.4$
以下为 Android 平台同名头文件定义:
yujinhe@ubuntu:~$ cat
/opt/my-android-toolchain/sysroot/usr/include/locale.h
#ifndef _LOCALE_H_
#define _LOCALE_H_
#include
__BEGIN_DECLS
enum {
LC_CTYPE = 0,
LC_NUMERIC = 1,
LC_TIME = 2,
LC_COLLATE = 3,
LC_MONETARY = 4,
LC_MESSAGES = 5,
LC_ALL = 6,
LC_PAPER = 7,
LC_NAME = 8,
LC_ADDRESS = 9,
LC_TELEPHONE = 10,
LC_MEASUREMENT = 11,
LC_IDENTIFICATION = 12
};
extern char *setlocale(int category, const char *locale);
#if 1
struct lconv { };
struct lconv *localeconv(void);
#endif
__END_DECLS
(2) pwd.h 文件不同
以下部分转自: http://blog.sina.com.cn/s/blog_515b90d00100or26.html
******************************************************************
[转载] 关于passwd结构相关 (2011-01-19 20:55:09)
在头文件/usr/include/pwd.h中,
struct passwd
{
char *
pw_name; char *
pw_passwd; __uid_t
pw_uid; __gid_t
pw_gid; char *
pw_gecos; char *
pw_dir; char *
pw_shell; };
--------------------------------------------------------------------------------
当您需要取得有关某个使用者的资讯时,大致上有以下几个函数可以使用:
--------------------------------------------------------------------------------
struct passwd * getpwuid(uid_t uid);
当您知道使用者的uid(user id)时,可以透过getpwuid来得知所有关於该使用者的相关资讯。
--------------------------------------------------------------------------------
struct passwd * getpwnam(char * name);
当您知道使用者名称时,可以透过getpwnam来得知所有关於该使用者的相关资讯。
--------------------------------------------------------------------------------
int getpw(uid_t uid, char *buf);
当您仅需要取得使用者的密码进行比对时,可以使用getpw。
--------------------------------------------------------------------------------
另外,有存取一系列使用者资讯的方法。
--------------------------------------------------------------------------------
FILE * pwdopen(void);
开启password档案。
--------------------------------------------------------------------------------
struct passwd * pwdread(FILE * stream,struct passwd *p);
读取一个使用者资讯进来,填到p中,返回p为成功,NULL为失败。
--------------------------------------------------------------------------------
void setpwent(void);
将读取资料流重设到起点。
--------------------------------------------------------------------------------
void endpwent(void);
关闭password档案资料流。
--------------------------------------------------------------------------------
struct passwd * getpwent(void);
读取一个使用者资讯进来,有必要的话,则将进行开档动作。
--------------------------------------------------------------------------------
struct passwd * fgetpwent(FILE * stream);
从档案中读取一个使用者资讯进来。
--------------------------------------------------------------------------------
int putpwent(struct passwd *p,FILE *f);
将一个使用者资讯写入档案中。
--------------------------------------------------------------------------------
struct passwd * pwdalloc(void);
******************************************************************
以下为 Android NDK 编译 Glib 时报的错误:
gutils.c: In function 'g_get_any_init_do':
gutils.c:832:2: warning: implicit declaration of function
'setpwent' [-Wimplicit-function-declaration]
gutils.c:840:8: error: 'struct passwd' has no member named
'pw_gecos'
gutils.c:840:25: error: 'struct passwd' has no member named
'pw_gecos'
gutils.c:846:35: error: 'struct passwd' has no member named
'pw_gecos'
gutils.c:749:12: warning: unused variable 'logname'
[-Wunused-variable]
gutils.c:748:10: warning: unused variable 'error'
[-Wunused-variable]
make[4]: *** [gutils.lo] Error 1
make[4]: Leaving directory
`/home/yujinhe/projects/NDK/jni/glib-2.32.4/glib'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory
`/home/yujinhe/projects/NDK/jni/glib-2.32.4/glib'
make[2]: *** [all] Error 2
make[2]: Leaving directory
`/home/yujinhe/projects/NDK/jni/glib-2.32.4/glib'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory
`/home/yujinhe/projects/NDK/jni/glib-2.32.4'
make: *** [all] Error 2
以下为 Android 平台同名头文件定义:
cat
/opt/my-android-toolchain/sysroot/usr/include/pwd.h
#ifndef _PWD_H_
#define _PWD_H_
#include
#include
#define
_PATH_PASSWD "/etc/passwd"
#define _PATH_MASTERPASSWD "/etc/master.passwd"
#define _PATH_MASTERPASSWD_LOCK "/etc/ptmp"
#define _PATH_PASSWD_CONF "/etc/passwd.conf"
#define
_PATH_PASSWDCONF _PATH_PASSWD_CONF #define _PATH_USERMGMT_CONF "/etc/usermgmt.conf"
#define
_PATH_MP_DB "/etc/pwd.db"
#define
_PATH_SMP_DB "/etc/spwd.db"
#define
_PATH_PWD_MKDB "/usr/sbin/pwd_mkdb"
#define
_PW_KEYBYNAME '1'
#define
_PW_KEYBYNUM '2'
#define
_PW_KEYBYUID '3'
#define
_PASSWORD_EFMT1 '_'
#define
_PASSWORD_NONDES '$'
#define
_PASSWORD_LEN 128
#define
_PASSWORD_NOUID 0x01 #define
_PASSWORD_NOGID 0x02 #define
_PASSWORD_NOCHG 0x04 #define
_PASSWORD_NOEXP 0x08
#define
_PASSWORD_OLDFMT 0x10 #define
_PASSWORD_NOWARN 0x20
#define _PASSWORD_WARNDAYS 14 #define
_PASSWORD_CHGNOW -1
struct passwd
{
char*
pw_name;
char*
pw_passwd;
uid_t
pw_uid;
gid_t
pw_gid;
char*
pw_dir;
char*
pw_shell;
};
__BEGIN_DECLS
struct passwd* getpwnam(const char*);
struct passwd* getpwuid(uid_t);
void endpwent(void);
#if 0
int getpwnam_r(const char*, struct passwd*, char*, size_t, struct
passwd**);
int getpwuid_r(uid_t, struct passwd*, char*, size_t, struct
passwd**);
struct passwd* getpwent(void);
int setpwent(void);
#endif
__END_DECLS
#endif