glib-格式化字符串

参考链接

目的

用于传统C变量和GVariant变量之间的转换
C转换成GVar使用:g_variant_new()
GVar转换成C使用:g_variant_get()

格式符含义对照表

symbolmeaning
b,y,n,q,i,u,x,t,h,d数值类型
s,o,g字符串类型
v通用Variant类型
a数组类型
mMaybe类型*
()元组类型
{}字典类型
@,*,?,r特殊类型*
&指针类型
^转换类型*

标记*比较特别,暂不做说明

数值类型

不同的字符对应不同的类型,对照表如下

characterC type
bgboolean
yguchar
ngint16
qguint16
igint32
uguint32
xgint64
tguint64
hgint32
dgdouble

其中glib中也定义了一些通用类型 /usr/include/glib-2.0/gtypes.h

typedef char   					gchar;
typedef short  					gshort;
typedef long   					glong;
typedef int    					gint;
typedef unsigned char   		guchar;
typedef unsigned short  		gushort;
typedef unsigned long   		gulong;
typedef unsigned int    		guint;

typedef gint   					gboolean;
typedef float   				gfloat;
typedef double  				gdouble;

typedef signed char 			gint8;
typedef unsigned char 			guint8;
typedef signed short 			gint16;
typedef unsigned short 			guint16;
typedef signed int 				gint32;
typedef unsigned int 			guint32;
typedef signed long 			gint64;
typedef unsigned long 			guint64;

参考代码:

GVariant *value1, *value2, *value3, *value4;

value1 = g_variant_new ("y", 200);
value2 = g_variant_new ("b", TRUE);
value3 = g_variant_new ("d", 37.5):
value4 = g_variant_new ("x", G_GINT64_CONSTANT (998877665544332211));

{
  gdouble floating;
  gboolean truth;
  gint64 bignum;

  g_variant_get (value1, "y", NULL);      /* ignore the value. */
  g_variant_get (value2, "b", &truth);
  g_variant_get (value3, "d", &floating);
  g_variant_get (value4, "x", &bignum);
}

字符串类型

参考代码:

GVariant *value1, *value2, *value3;

value1 = g_variant_new ("s", "hello world!");
value2 = g_variant_new ("o", "/must/be/a/valid/path");
value3 = g_variant_new ("g", "iias");

#if 0
  g_variant_new ("s", NULL);      /* not valid: NULL is not a string. */
#endif

{
  gchar *result;

  g_variant_get (value1, "s", &result); // 1. 这里会重新分配内存
  g_print ("It was '%s'\n", result);
  g_free (result); // 2. 注意这里需要free释放内存,区别于“指针类型”
}

指针类型

参考代码:

{
  const gchar *str;
  GVariant *value;

  value = g_variant_new ("&s", "hello world");
  g_variant_get (value, "&s", &str); // 1. 这里不会重新分配内存,只是返回一个地址
  g_print ("string is: %s\n", str); // 2. 所以不需要free释放内存
  /* no need to free str */
}

通用类型

参考代码:

GVariant *x, *y;

/* the following two lines are equivalent: */
x = g_variant_new ("v", y);
x = g_variant_new_variant (y);

/* as are these: */
g_variant_get (x, "v", &y);
y = g_variant_get_variant (x);

数组类型

参考代码:

GVariantBuilder *builder;
GVariant *value;

builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
g_variant_builder_add (builder, "s", "when");
g_variant_builder_add (builder, "s", "in");
g_variant_builder_add (builder, "s", "the");
g_variant_builder_add (builder, "s", "course");
value = g_variant_new ("as", builder);
g_variant_builder_unref (builder); // unref解引用,会释放内存

{
  GVariantIter *iter;
  gchar *str;

  g_variant_get (value, "as", &iter);
  while (g_variant_iter_loop (iter, "s", &str))
    g_print ("%s\n", str);
  g_variant_iter_free (iter);
}

g_variant_unref (value); // unref解引用

对于glib通用类型 GVariant 变量来说,资源不使用的情况下只需要调用解引用 unref,此接口内部会free释放内存资源。

元组类型

参考代码:

GVariant *value1, *value2;

value1 = g_variant_new ("(s(ii))", "Hello", 55, 77);
value2 = g_variant_new ("()");

{
  gchar *string;
  gint x, y;

  g_variant_get (value1, "(s(ii))", &string, &x, &y);
  g_print ("%s, %d, %d\n", string, x, y);
  g_free (string);

  g_variant_get (value2, "()");   /* do nothing... */
}

字典类型

参考代码:

GVariantBuilder *b;
GVariant *dict;

b = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (b, "{sv}", "name", g_variant_new_string ("foo"));
g_variant_builder_add (b, "{sv}", "timeout", g_variant_new_int32 (10));
dict = g_variant_builder_end (b);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值