GLib学习

2023-10-27

Gstreamer 基础


【学习博客】

一、glib

glib介绍

1.1 类型介绍

glib的类型定义在gtypes.h文件中,关键定义如下:

1.1.1 不规则类型
gboolean
gpointer
gconstpointer
gchar
guchar
1.1.2 整型
gint
G_MININT
G_MAXINT
guint
G_MAXUINT
gshort
G_MINSHORT
G_MAXSHORT
gushort
G_MAXUSHORT
glong
G_MINLONG
G_MAXLONG
gulong
G_MAXULONG

gint8
G_MININT8
G_MAXINT8
guint8
G_MAXUINT8
gint16
G_MININT16
G_MAXINT16
G_GINT16_MODIFIER
G_GINT16_FORMAT
guint16
G_MAXUINT16
G_GUINT16_FORMAT
gint32
G_MININT32
G_MAXINT32
G_GINT32_MODIFIER
G_GINT32_FORMAT
guint32
G_MAXUINT32
G_GUINT32_FORMAT
gint64
G_MININT64
G_MAXINT64
G_GINT64_MODIFIER
G_GINT64_FORMAT
G_GINT64_CONSTANT
guint64
G_MAXUINT64
G_GUINT64_FORMAT
G_GUINT64_CONSTANT

指针
gintptr
G_GINTPTR_MODIFIER
G_GINTPTR_FORMAT
guintptr
G_GUINTPTR_FORMAT
1.1.3 浮点型
gfloat
G_MINFLOAT
G_MAXFLOAT
gdouble
G_MINDOUBLE
G_MAXDOUBLE
1.1.4 size
gsize
G_MAXSIZE
G_GSIZE_MODIFIER
G_GSIZE_FORMAT
gssize
G_MINSSIZE
G_MAXSSIZE
G_GSSIZE_MODIFIER
G_GSSIZE_FORMAT
goffset
G_MINOFFSET
G_MAXOFFSET
G_GOFFSET_MODIFIER
G_GOFFSET_FORMAT
G_GOFFSET_CONSTANT

1.2 宏介绍

2.1.1 glibconfig.h中包含定义了一些有关系统的宏
#define G_MODULE_SUFFIX "so"
...
#define G_DIR_SEPARATOR '/'
#define G_DIR_SEPARATOR_S "/"
#define G_SEARCHPATH_SEPARATOR ':'
#define G_SEARCHPATH_SEPARATOR_S ":"
...
类型转换
#define GPOINTER_TO_INT(p)	((gint)  (glong) (p))
#define GPOINTER_TO_UINT(p)	((guint) (gulong) (p))

#define GINT_TO_POINTER(i)	((gpointer) (glong) (i))
#define GUINT_TO_POINTER(u)	((gpointer) (gulong) (u))

2.1.2 gmacros.h中定义了宏
#define	FALSE	(0)
#define	TRUE	(!FALSE)
#define MAX(a, b)  (((a) > (b)) ? (a) : (b))
#define MIN(a, b)  (((a) < (b)) ? (a) : (b))
#define ABS(a)	   (((a) < 0) ? -(a) : (a))
#define CLAMP(x, low, high)  (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
#define G_APPROX_VALUE(a, b, epsilon) \
  (((a) > (b) ? (a) - (b) : (b) - (a)) < (epsilon))

  ...
G_SIZEOF_MEMBER
G_STRUCT_MEMBER
G_STRUCT_MEMBER_P
G_STRUCT_OFFSET
2.1.3 gtypes.h中定义了宏
#define G_LITTLE_ENDIAN 1234
#define G_BIG_ENDIAN    4321
#define G_PDP_ENDIAN    3412
...

#define g_ntohl(val) (GUINT32_FROM_BE (val))
#define g_ntohs(val) (GUINT16_FROM_BE (val))
#define g_htonl(val) (GUINT32_TO_BE (val))
#define g_htons(val) (GUINT16_TO_BE (val))

#define g_uint_checked_add(dest, a, b) \
    (!__builtin_add_overflow(a, b, dest))
#define g_uint_checked_mul(dest, a, b) \
    (!__builtin_mul_overflow(a, b, dest))

#define g_uint64_checked_add(dest, a, b) \
    (!__builtin_add_overflow(a, b, dest))
#define g_uint64_checked_mul(dest, a, b) \
    (!__builtin_mul_overflow(a, b, dest))

#define g_size_checked_add(dest, a, b) \
    (!__builtin_add_overflow(a, b, dest))
#define g_size_checked_mul(dest, a, b) \
    (!__builtin_mul_overflow(a, b, dest))

1.2 通用函数介绍

1.2.1 错误函数
g_error_new
g_error_new_literal
g_error_new_valist
g_error_free
g_error_copy
g_error_matches
g_set_error
g_set_error_literal
g_propagate_error
g_clear_error
g_prefix_error
g_prefix_error_literal
g_propagate_prefixed_error

GErrorInitFunc
GErrorCopyFunc
GErrorClearFunc
G_DEFINE_EXTENDED_ERROR
g_error_domain_register_static
g_error_domain_register


1.2.2 事件循环
g_main_loop_new
g_main_loop_ref
g_main_loop_unref
g_main_loop_run
g_main_loop_quit
g_main_loop_is_running
g_main_loop_get_context
g_main_new
g_main_destroy
g_main_run
g_main_quit
g_main_is_running

G_PRIORITY_HIGH
G_PRIORITY_DEFAULT
G_PRIORITY_HIGH_IDLE
G_PRIORITY_DEFAULT_IDLE
G_PRIORITY_LOW

时间循环的上下文创建
GMainContext
GMainContextFlags
g_main_context_new
g_main_context_new_with_flags
g_main_context_ref
g_main_context_unref
g_main_context_default
g_main_context_iteration
g_main_iteration
g_main_context_pending
g_main_pending
g_main_context_find_source_by_id
g_main_context_find_source_by_user_data
g_main_context_find_source_by_funcs_user_data
g_main_context_wakeup
g_main_context_acquire
g_main_context_release
g_main_context_is_owner
g_main_context_wait
g_main_context_prepare
g_main_context_query
g_main_context_check
g_main_context_dispatch
g_main_context_set_poll_func
g_main_context_get_poll_func
GPollFunc
g_main_context_add_poll
g_main_context_remove_poll
g_main_depth
g_main_current_source
g_main_set_poll_func
g_main_context_invoke
g_main_context_invoke_full

GMainContextPusher
g_main_context_pusher_new
g_main_context_pusher_free
g_main_context_get_thread_default
g_main_context_ref_thread_default
g_main_context_push_thread_default
g_main_context_pop_thread_default

超时资源创建
g_timeout_source_new
g_timeout_source_new_seconds
g_timeout_add
g_timeout_add_full
g_timeout_add_seconds
g_timeout_add_seconds_full

idle资源
g_idle_source_new
g_idle_add
g_idle_add_full
g_idle_remove_by_data

资源函数
GSource
GSourceDummyMarshal
GSourceFuncs
GSourceDisposeFunc
GSourceCallbackFuncs
g_source_new
g_source_ref
g_source_unref
g_source_set_funcs
g_source_set_dispose_function
g_source_attach
g_source_destroy
g_source_is_destroyed
g_source_set_priority
g_source_get_priority
g_source_set_can_recurse
g_source_get_can_recurse
g_source_get_id
g_source_get_name
g_source_set_name
g_source_set_static_name
g_source_set_name_by_id
g_source_get_context
g_source_set_callback
GSourceFunc
G_SOURCE_FUNC
g_source_set_callback_indirect
g_source_set_ready_time
g_source_get_ready_time
g_source_add_unix_fd
g_source_remove_unix_fd
g_source_modify_unix_fd
g_source_query_unix_fd
g_source_add_poll
g_source_remove_poll
g_source_add_child_source
g_source_remove_child_source
g_source_get_time
g_source_get_current_time
g_source_remove
g_source_remove_by_funcs_user_data
g_source_remove_by_user_data
GClearHandleFunc
g_clear_handle_id

Glib实现了完整的事件循环分发机制,每个主循环负责处理各种事件,事件通过事件源描述。
每个事件源都会关联一个GMainCOntext,一个线程只能运行一个GMaincontext,但是其它线程能够对事件源进行添加和删除操作。

// 代表一个主事件循环,通过g_main_loop_new来创建,在添加完毕初始事件源后执行
// g_main_loop_run() 主循环将持续不断的检查每个事件源产生的新事件,然后分发它们,、
//最后通过g_main_loop_quit()退出

struct _GMainLoop
{
  GMainContext *context;
  gboolean is_running; /* (atomic) */
  gint ref_count;  /* (atomic) */
};


struct _GMainContext
{
  /* The following lock is used for both the list of sources
   * and the list of poll records
   */
  GMutex mutex;
  GCond cond;
  GThread *owner;
  guint owner_count;
  GMainContextFlags flags;
  GSList *waiters;

  gint ref_count;  /* (atomic) */

  GHashTable *sources;              /* guint -> GSource */

  GPtrArray *pending_dispatches;
  gint timeout;			/* Timeout for current iteration */

  guint next_id;
  GList *source_lists;
  gint in_check_or_prepare;

  GPollRec *poll_records;
  guint n_poll_records;
  GPollFD *cached_poll_array;
  guint cached_poll_array_size;

  GWakeup *wakeup;

  GPollFD wake_up_rec;

/* Flag indicating whether the set of fd's changed during a poll */
  gboolean poll_changed;

  GPollFunc poll_func;

  gint64   time;
  gboolean time_is_fresh;
};

//每个事件源
struct _GSource
{
  /*< private >*/
  gpointer callback_data;

  // 所有事件源的回调函数
  GSourceCallbackFuncs *callback_funcs;

  const GSourceFuncs *source_funcs;
  guint ref_count;

  GMainContext *context;

  gint priority;
  guint flags;
  guint source_id;

  GSList *poll_fds;// 监听的fd
  
  GSource *prev;
  GSource *next;

  char    *name;

  GSourcePrivate *priv;
};

struct _GSourceFuncs
{
  gboolean (*prepare)  (GSource    *source,
                        gint       *timeout_);/* Can be NULL */
  gboolean (*check)    (GSource    *source);/* Can be NULL */
  gboolean (*dispatch) (GSource    *source,
                        GSourceFunc callback,
                        gpointer    user_data);
  void     (*finalize) (GSource    *source); /* Can be NULL */

  /*< private >*/
  /* For use by g_source_set_closure */
  GSourceFunc     closure_callback;        
  GSourceDummyMarshal closure_marshal; /* Really is of type GClosureMarshal */
};

上面三个核心结构体就是整个事件的核心,GSource代表一个事件源,内部有一个回调函数,当该事件源有事件发生的时候就触发该函数。

另外事件源有四个函数prepare、check、dispatch以及finalize,这四个函数代表了了一个事件源的生命不同周期:
prepare : 设置检查事件时间超时。如果返回 TRUE, check 会立刻被调用;如果返回 FALSE 并设置了 timeout , timeout 时间后 check 会被调用。
check : 检查事件是否准备完毕。返回 TRUE 为准备完毕, dispatch 会被立刻调用;返回 FALSE 不调用 dispatch,进入下一次事件循环。
dispatch : 分发事件。返回 TRUE 将继续下一次操作循环;返回 FALSE 中止本事件源的事件循环。
finalize : 当事件源被移除时被调用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DH92USTF-1652539228309)(gst-event-loop.png)]

如下代码是对调用的分析:

GMainLoop *
g_main_loop_new (GMainContext *context,
		 gboolean      is_running)
{
  GMainLoop *loop;

  if (!context)
    context = g_main_context_default();
  
  g_main_context_ref (context);

  loop = g_new0 (GMainLoop, 1);
  loop->context = context;
  loop->is_running = is_running != FALSE;
  loop->ref_count = 1;

  TRACE (GLIB_MAIN_LOOP_NEW (loop, context));

  return loop;
}

void 
g_main_loop_run (GMainLoop *loop)
{
  GThread *self = G_THREAD_SELF;

  g_return_if_fail (loop != NULL);
  g_return_if_fail (g_atomic_int_get (&loop->ref_count) > 0);

[...]

  g_atomic_int_set (&loop->is_running, TRUE);
  while (g_atomic_int_get (&loop->is_running))
    g_main_context_iterate (loop->context, TRUE, TRUE, self);

  UNLOCK_CONTEXT (loop->context);
  
  g_main_context_release (loop->context);
  
  g_main_loop_unref (loop);
}


/* HOLDS context lock */
static gboolean
g_main_context_iterate (GMainContext *context,
			gboolean      block,
			gboolean      dispatch,
			GThread      *self)
{
  //[...]

  //  prepare阶段
  g_main_context_prepare (context, &max_priority); 
  
  while ((nfds = g_main_context_query (context, max_priority, &timeout, fds, 
				       allocated_nfds)) > allocated_nfds)
    {
      LOCK_CONTEXT (context);
      g_free (fds);
      context->cached_poll_array_size = allocated_nfds = nfds;
      context->cached_poll_array = fds = g_new (GPollFD, nfds);
      UNLOCK_CONTEXT (context);
    }

  if (!block)
    timeout = 0;
  
  g_main_context_poll (context, timeout, max_priority, fds, nfds);
  
  // check 阶段
  some_ready = g_main_context_check (context, max_priority, fds, nfds);
  
  //分发阶段
  if (dispatch)
    g_main_context_dispatch (context);
  
  g_main_context_release (context);

// [...]

  return some_ready;
}

Glib实现了一个功能强大的事件循环分发处理机制,Glib内部提供三种类型的事件源:

  • Timeout
  • Idle
  • ChildWatch

glib中已经提供了几个GSource的子类,其中的g_timeout_source_new(guint interval)和g_idle_source_new(void)这两个函数构造出的GSource子类,就并不使用文件描述符号。

GTimeoutSource,只需要保存设定的间隔时间,在poll轮循的prepare和check阶段,会去检查设定的这个间隔时间是否到达,如果到达设定的时间,则它的dispatch函数会被调用。

g_idle_source_new(void)其实都没有继承GSource,它也不需要和文件绑定,只不过它的优先级比较低,只有在poll轮询的空闲阶段,它的dispatch函数会被调用。而它的prepare和check函数,始终都是返回的TRUE。

Timeout事件源使用案例:

/* test.c */
int main(int argc, char const *argv[]) {
    /* 1.创建一个 GMainLoop 结构体对象,作为一个主事件循环 */
    GMainLoop *loop = g_main_loop_new(NULL, FALSE);

    /* 2.添加超时事件源 */
    g_timeout_add(1000, count_down, NULL);
    g_timeout_add(8000, cancel_fire, loop);

    /* 3.添加空闲函数,没有更高优先级事件时,空闲函数就可以被执行 */
    g_idle_add(say_idle, NULL);

    /* 4.循环检查事件源中是否有新事件进行分发,当某事件处理函数调用 g_main_loop_quit(),函数退出 */
    g_main_loop_run(loop);

    /* 5.减少loop引用计数,如果计数为0,则会释放loop资源 */
    g_main_loop_unref(loop);

    return 0;
}

Idle事件源


Child Watch——系统定义的事件源

Child Watch——自定义事件源

#include <glib.h>

//设置检查事件时间超时。如果返回 TRUE, check 会立刻被调用;如果返回 FALSE 并设置了 timeout , timeout 时间后 check 会被调用。
gboolean source_prepare_cb(GSource * source,
            gint * timeout)
{
    g_printf("prepare\n");
    *timeout = 1000;
    return FALSE;
}

//检查事件是否准备完毕。返回 TRUE 为准备完毕, dispatch 会被立刻调用;返回 FALSE 不调用 dispatch,进入下一次事件循环。
gboolean source_check_cb(GSource * source)
{
    g_printf("check\n");
    return TRUE;
}

//分发事件。返回 TRUE 将继续下一次操作循环;返回 FALSE 中止本事件源的事件循环。
gboolean source_dispatch_cb(GSource * source,
            GSourceFunc callback, gpointer data)
{
    g_printf("dispatch\n");
    return TRUE;
}

//当事件源被移除时被调用。
void source_finalize_cb(GSource * source)
{
    g_printf("finalize\n");
}

int main(int argc, char * argv[])
{
    GMainLoop * mainloop;
    GMainContext * maincontext;
    GSource * source;
    GSourceFuncs sourcefuncs;

    sourcefuncs.prepare = source_prepare_cb;
    sourcefuncs.check = source_check_cb;
    sourcefuncs.dispatch = source_dispatch_cb;
    sourcefuncs.finalize = source_finalize_cb;

    mainloop = g_main_loop_new(NULL, FALSE);
    maincontext = g_main_loop_get_context(mainloop);
    source = g_source_new(&sourcefuncs, sizeof(GSource));
    g_source_attach(source, maincontext);

    g_main_loop_run(mainloop);

    return 0;
}
1.2.3 线程类函数
GThread
GThreadFunc
g_thread_new
g_thread_try_new
g_thread_ref
g_thread_unref
g_thread_join
g_thread_yield
g_thread_exit
g_thread_self

线程池
GThreadPool
g_thread_pool_new
g_thread_pool_new_full
g_thread_pool_push
g_thread_pool_set_max_threads
g_thread_pool_get_max_threads
g_thread_pool_get_num_threads
g_thread_pool_unprocessed
g_thread_pool_free
g_thread_pool_set_max_unused_threads
g_thread_pool_get_max_unused_threads
g_thread_pool_get_num_unused_threads
g_thread_pool_stop_unused_threads
g_thread_pool_set_sort_function
g_thread_pool_set_max_idle_time
g_thread_pool_get_max_idle_time
g_thread_pool_move_to_front

异步队列
GAsyncQueue
g_async_queue_new
g_async_queue_new_full
g_async_queue_ref
g_async_queue_unref
g_async_queue_push
g_async_queue_push_sorted
g_async_queue_push_front
g_async_queue_remove
g_async_queue_pop
g_async_queue_try_pop
g_async_queue_timeout_pop
g_async_queue_length
g_async_queue_sort

g_async_queue_lock
g_async_queue_unlock
g_async_queue_ref_unlocked
g_async_queue_unref_and_unlock
g_async_queue_push_unlocked
g_async_queue_push_sorted_unlocked
g_async_queue_push_front_unlocked
g_async_queue_remove_unlocked
g_async_queue_pop_unlocked
g_async_queue_try_pop_unlocked
g_async_queue_timeout_pop_unlocked
g_async_queue_length_unlocked
g_async_queue_sort_unlocked

原子操作
g_atomic_pointer_get
g_atomic_pointer_set
g_atomic_pointer_compare_and_exchange
g_atomic_pointer_add
g_atomic_pointer_and
g_atomic_pointer_or
g_atomic_pointer_xor
g_atomic_int_exchange_and_add
1.2.4 互斥锁类函数
GMutex
g_mutex_init
g_mutex_clear
g_mutex_lock
g_mutex_trylock
g_mutex_unlock

GMutexLocker
g_mutex_locker_new
g_mutex_locker_free

宏函数
G_LOCK_DEFINE
G_LOCK_DEFINE_STATIC
G_LOCK_EXTERN
G_LOCK
G_TRYLOCK
G_UNLOCK

递归锁
GRecMutex
g_rec_mutex_init
g_rec_mutex_clear
g_rec_mutex_lock
g_rec_mutex_trylock
g_rec_mutex_unlock

GRecMutexLocker
g_rec_mutex_locker_new
g_rec_mutex_locker_free

读写锁
GRWLockWriterLocker
g_rw_lock_writer_locker_new
g_rw_lock_writer_locker_free

GRWLockReaderLocker
g_rw_lock_reader_locker_new
g_rw_lock_reader_locker_free

GRWLock
g_rw_lock_init
g_rw_lock_clear
g_rw_lock_writer_lock
g_rw_lock_writer_trylock
g_rw_lock_writer_unlock
g_rw_lock_reader_lock
g_rw_lock_reader_trylock
g_rw_lock_reader_unlock

g_bit_lock
g_bit_trylock
g_bit_unlock
g_pointer_bit_lock
g_pointer_bit_trylock
g_pointer_bit_unlock

1.2.5 条件变量类函数
GCond
g_cond_init
g_cond_clear
g_cond_wait
g_cond_timed_wait
g_cond_wait_until
g_cond_signal
g_cond_broadcast

Glib提供了线程池和线程处理函数,首先会创建一个线程池,当有数据要处理的时候就把数据交给其中一个线程,处理完毕后再归还给线程池。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9XyuNHfZ-1652539228310)(glib-thread.png)]

多线程异步队列:
所有的数据组织成队列,供多线程并发访问,而这些并发控制全部在异步队列里面实现,对外面只提供读写接口;当队列中的数据为空时, 如果是读线程访问异步队列,那么这一读线程就等待,直到有数据为止;写线程向队列放数据时,如果有线程在等待数据就唤醒等待线程。

异步队列提供接口函数,提供两种类型,无锁和带锁:

typedef struct _GAsyncQueue GAsyncQueue;
// 异步队列的创建
GAsyncQueue * 	g_async_queue_new ()
GAsyncQueue * 	g_async_queue_new_full ()



// 异步队列的操作
GAsyncQueue * 	g_async_queue_ref ()
void 	g_async_queue_unref ()
void 	g_async_queue_push ()
void 	g_async_queue_push_sorted ()
void 	g_async_queue_push_front ()
gboolean 	g_async_queue_remove ()
gpointer 	g_async_queue_pop ()
gpointer 	g_async_queue_try_pop ()
gpointer 	g_async_queue_timeout_pop ()
gint 	g_async_queue_length ()
void 	g_async_queue_sort ()

// 异步队列带锁和不带锁
void 	g_async_queue_lock ()
void 	g_async_queue_unlock ()
void 	g_async_queue_ref_unlocked ()
void 	g_async_queue_unref_and_unlock ()
void 	g_async_queue_push_unlocked ()
void 	g_async_queue_push_sorted_unlocked ()
void 	g_async_queue_push_front_unlocked ()
gboolean 	g_async_queue_remove_unlocked ()
gpointer 	g_async_queue_pop_unlocked ()
gpointer 	g_async_queue_try_pop_unlocked ()
gpointer 	g_async_queue_timeout_pop_unlocked ()
gint 	g_async_queue_length_unlocked ()
void 	g_async_queue_sort_unlocked ()
gpointer 	g_async_queue_timed_pop ()
gpointer 	g_async_queue_timed_pop_unlocked ()


案例:

#include <glib.h>

static gpointer test_aqueue_push_func(gpointer data)
{
    GAsyncQueue *aqueue = NULL;

    g_print("%s \n", __FUNCTION__);
    g_print("delay 2 seconds to push data \n");
    g_usleep(2*1000*1000);

    aqueue = (GAsyncQueue *)data;

    g_async_queue_push(aqueue, GINT_TO_POINTER(99));

    return NULL;
}

static gpointer test_aqueue_pop_func(gpointer data)
{
    gpointer val = NULL;
    GAsyncQueue *aqueue = NULL;
    g_print("%s \n", __FUNCTION__);

    aqueue = (GAsyncQueue *)data;

    val = g_async_queue_pop(aqueue);
    g_print("val: %d \n", GPOINTER_TO_INT(val));

    return NULL;
}

gint main(gint argc, gchar **argv)
{
    GThread *thd_push, *thd_pop;
    GAsyncQueue *aqueue = NULL;

    aqueue = g_async_queue_new();

    thd_push = g_thread_new("thd_push", test_aqueue_push_func, aqueue);
    thd_pop  = g_thread_new("thd_pop", test_aqueue_pop_func, aqueue);

    g_thread_join(thd_push);
    g_thread_join(thd_pop);

    g_async_queue_unref(aqueue);

    return 0;
}

线程池:
线程池是在多线程编程时经常用到的技术。在进行多线程任务处理时,如果线程频繁创建和销毁,将会使系统开销变大,在这种情况下,上一个任务执行完后不销毁之前创建的线程,后续任务重用该线程,将会大大减小开销。为了管理这些创建之后不再销毁的线程,便有了线程池的概念。
GLib的线程池除了提供一般的线程池函数外,还提供了诸如获取当前运行的线程数量、获取未处理的任务数量、获取或设置线程池的最大线程数量、获取未使用的线程数量、设置未使用的最大线程数量、停止所有目前未使用的线程,但经过实际测试,这里面有些功能并未生效。

[原文链接:https://blog.csdn.net/field1003/article/details/123436105]

struct _GThreadPool
{
  GFunc func;
  gpointer user_data;
  gboolean exclusive;
};


GLIB_AVAILABLE_IN_ALL
GThreadPool *   g_thread_pool_new               (GFunc            func,
                                                 gpointer         user_data,
                                                 gint             max_threads,
                                                 gboolean         exclusive,
                                                 GError         **error);
GLIB_AVAILABLE_IN_2_70
GThreadPool *   g_thread_pool_new_full          (GFunc            func,
                                                 gpointer         user_data,
                                                 GDestroyNotify   item_free_func,
                                                 gint             max_threads,
                                                 gboolean         exclusive,
                                                 GError         **error);
GLIB_AVAILABLE_IN_ALL
void            g_thread_pool_free              (GThreadPool     *pool,
                                                 gboolean         immediate,
                                                 gboolean         wait_);
GLIB_AVAILABLE_IN_ALL
gboolean        g_thread_pool_push              (GThreadPool     *pool,
                                                 gpointer         data,
                                                 GError         **error);
GLIB_AVAILABLE_IN_ALL
guint           g_thread_pool_unprocessed       (GThreadPool     *pool);
GLIB_AVAILABLE_IN_ALL
void            g_thread_pool_set_sort_function (GThreadPool      *pool,
                                                 GCompareDataFunc  func,
                                                 gpointer          user_data);
GLIB_AVAILABLE_IN_2_46
gboolean        g_thread_pool_move_to_front     (GThreadPool      *pool,
                                                 gpointer          data);

GLIB_AVAILABLE_IN_ALL
gboolean        g_thread_pool_set_max_threads   (GThreadPool     *pool,
                                                 gint             max_threads,
                                                 GError         **error);
GLIB_AVAILABLE_IN_ALL
gint            g_thread_pool_get_max_threads   (GThreadPool     *pool);
GLIB_AVAILABLE_IN_ALL
guint           g_thread_pool_get_num_threads   (GThreadPool     *pool);

GLIB_AVAILABLE_IN_ALL
void            g_thread_pool_set_max_unused_threads (gint  max_threads);
GLIB_AVAILABLE_IN_ALL
gint            g_thread_pool_get_max_unused_threads (void);
GLIB_AVAILABLE_IN_ALL
guint           g_thread_pool_get_num_unused_threads (void);
GLIB_AVAILABLE_IN_ALL
void            g_thread_pool_stop_unused_threads    (void);
GLIB_AVAILABLE_IN_ALL
void            g_thread_pool_set_max_idle_time      (guint interval);
GLIB_AVAILABLE_IN_ALL
guint           g_thread_pool_get_max_idle_time      (void);
1.2.6 执行一次
GOnce
GOnceStatus
G_ONCE_INIT
g_once
g_once_init_enter
g_once_init_leave
1.2.7 IO类函数
g_io_channel_new_file
g_io_channel_read_chars
g_io_channel_read_unichar
g_io_channel_read_line
g_io_channel_read_line_string
g_io_channel_read_to_end
g_io_channel_write_chars
g_io_channel_write_unichar
g_io_channel_flush
g_io_channel_seek_position

GSeekType
g_io_channel_shutdown

GIOStatus
GIOChannelError
G_IO_CHANNEL_ERROR
g_io_channel_error_from_errno

g_io_channel_ref
g_io_channel_unref

g_io_create_watch
g_io_add_watch
g_io_add_watch_full
GIOCondition
GIOFunc

g_io_channel_get_buffer_size
g_io_channel_set_buffer_size
g_io_channel_get_buffer_condition
g_io_channel_get_flags
g_io_channel_set_flags
GIOFlags
g_io_channel_get_line_term
g_io_channel_set_line_term
g_io_channel_get_buffered
g_io_channel_set_buffered
g_io_channel_get_encoding
g_io_channel_set_encoding
g_io_channel_get_close_on_unref
g_io_channel_set_close_on_unref

g_io_channel_read
GIOError
g_io_channel_write
g_io_channel_seek
g_io_channel_close
1.2.8 内存分配类函数(Memory Allocation)
g_new
g_new0
g_renew
g_try_new
g_try_new0
g_try_renew

g_malloc
g_malloc0
g_realloc
g_try_malloc
g_try_malloc0
g_try_realloc
g_malloc_n
g_malloc0_n
g_realloc_n
g_try_malloc_n
g_try_malloc0_n
g_try_realloc_n

g_free
g_clear_pointer
g_steal_pointer
g_mem_gc_friendly

g_alloca
g_alloca0
g_newa
g_newa0

g_aligned_alloc
g_aligned_alloc0
g_aligned_free

g_memmove
g_memdup
g_memdup2

1.2.9 Warnings and Assertions类函数
g_print
g_set_print_handler
GPrintFunc

g_printerr
g_set_printerr_handler

g_return_if_fail
g_return_val_if_fail
g_return_if_reached
g_return_val_if_reached
g_warn_if_fail
g_warn_if_reached

g_on_error_query
g_on_error_stack_trace

g_return_if_fail_warning
g_assert_warning
g_warn_message
1.2.10 Glob-style pattern matching类函数
GPatternSpec
g_pattern_spec_new
g_pattern_spec_free
g_pattern_spec_equal
g_pattern_spec_copy
g_pattern_spec_match
g_pattern_spec_match_string
g_pattern_match
g_pattern_match_string
g_pattern_match_simple
1.2.11 正则表达式类函数
GRegexError
G_REGEX_ERROR
GRegexCompileFlags
GRegexMatchFlags
GRegex
GRegexEvalCallback
g_regex_new
g_regex_ref
g_regex_unref
g_regex_get_pattern
g_regex_get_max_backref
g_regex_get_capture_count
g_regex_get_has_cr_or_lf
g_regex_get_max_lookbehind
g_regex_get_string_number
g_regex_get_compile_flags
g_regex_get_match_flags
g_regex_escape_string
g_regex_escape_nul
g_regex_match_simple
g_regex_match
g_regex_match_full
g_regex_match_all
g_regex_match_all_full
g_regex_split_simple
g_regex_split
g_regex_split_full
g_regex_replace
g_regex_replace_literal
g_regex_replace_eval
g_regex_check_replacement
GMatchInfo
g_match_info_get_regex
g_match_info_get_string
g_match_info_ref
g_match_info_unref
g_match_info_free
g_match_info_matches
g_match_info_next
g_match_info_get_match_count
g_match_info_is_partial_match
g_match_info_expand_references
g_match_info_fetch
g_match_info_fetch_pos
g_match_info_fetch_named
g_match_info_fetch_named_pos
g_match_info_fetch_all
<SUBSECTION Private>
g_regex_error_quark
1.2.13 日志类函数
G_LOG_DOMAIN
G_LOG_FATAL_MASK
G_LOG_LEVEL_USER_SHIFT
GLogFunc
GLogLevelFlags

g_log
g_logv
g_message
g_warning
g_warning_once
g_critical
g_error
g_info
g_debug

g_log_set_handler
g_log_set_handler_full
g_log_remove_handler
g_log_set_always_fatal
g_log_set_fatal_mask
g_log_default_handler
g_log_set_default_handler
g_log_get_debug_enabled
g_log_set_debug_enabled

g_log_structured
g_log_variant
GLogField
g_log_structured_array
G_DEBUG_HERE

GLogWriterOutput
GLogWriterFunc
g_log_set_writer_func
g_log_writer_supports_color
g_log_writer_is_journald
g_log_writer_format_fields
g_log_writer_journald
g_log_writer_standard_streams
g_log_writer_default
g_log_writer_default_set_use_stderr
g_log_writer_default_would_drop
1.2.14 计时器类函数
GTimer
g_timer_new
g_timer_start
g_timer_stop
g_timer_continue
g_timer_elapsed
g_timer_reset
g_timer_destroy
g_timer_is_active
1.2.15 进程类函数
GSpawnError
G_SPAWN_ERROR
GSpawnFlags
GSpawnChildSetupFunc
g_spawn_async_with_fds
g_spawn_async_with_pipes
g_spawn_async_with_pipes_and_fds
g_spawn_async
g_spawn_sync
G_SPAWN_EXIT_ERROR
g_spawn_check_wait_status
g_spawn_check_exit_status
g_spawn_command_line_async
g_spawn_command_line_sync
g_spawn_close_pid
<SUBSECTION Private>
g_spawn_error_quark
g_spawn_exit_error_quark
1.2.16 互斥锁类函数(Simple XML Subset Parser)
GMarkupError
G_MARKUP_ERROR
GMarkupParseFlags
GMarkupParseContext
GMarkupParser
g_markup_escape_text
g_markup_printf_escaped
g_markup_vprintf_escaped
g_markup_parse_context_new
g_markup_parse_context_parse
g_markup_parse_context_end_parse
g_markup_parse_context_free
g_markup_parse_context_get_position
g_markup_parse_context_get_element
g_markup_parse_context_get_element_stack
g_markup_parse_context_get_user_data
g_markup_parse_context_push
g_markup_parse_context_pop
g_markup_parse_context_ref
g_markup_parse_context_unref
1.2.17 shell类函数
GShellError
G_SHELL_ERROR
g_shell_parse_argv
g_shell_quote
g_shell_unquote

命令行选项
GOptionError
G_OPTION_ERROR
GOptionArgFunc
GOptionContext
g_option_context_new
g_option_context_set_summary
g_option_context_get_summary
g_option_context_set_description
g_option_context_get_description
GTranslateFunc
g_option_context_set_translate_func
g_option_context_set_translation_domain
g_option_context_free
g_option_context_parse
g_option_context_parse_strv
g_option_context_set_help_enabled
g_option_context_get_help_enabled
g_option_context_set_ignore_unknown_options
g_option_context_get_ignore_unknown_options
g_option_context_get_help
g_option_context_get_strict_posix
g_option_context_set_strict_posix
GOptionArg
GOptionFlags
G_OPTION_REMAINING
GOptionEntry
G_OPTION_ENTRY_NULL
g_option_context_add_main_entries
GOptionGroup
g_option_context_add_group
g_option_context_set_main_group
g_option_context_get_main_group
g_option_group_new
g_option_group_ref
g_option_group_unref
g_option_group_free
g_option_group_add_entries
GOptionParseFunc
g_option_group_set_parse_hooks
GOptionErrorFunc
g_option_group_set_error_hook
g_option_group_set_translate_func
g_option_group_set_translation_domain
<SUBSECTION Private>
g_option_error_quark

文件类
GFileError
G_FILE_ERROR
GFileTest
g_file_error_from_errno
g_file_get_contents
GFileSetContentsFlags
g_file_set_contents
g_file_set_contents_full
g_file_test
g_mkstemp
g_mkstemp_full
g_file_open_tmp
g_file_read_link
g_mkdir_with_parents
g_mkdtemp
g_mkdtemp_full
g_dir_make_tmp

GDir
g_dir_open
g_dir_read_name
g_dir_rewind
g_dir_close


GMappedFile
g_mapped_file_new
g_mapped_file_new_from_fd
g_mapped_file_ref
g_mapped_file_unref
g_mapped_file_free
g_mapped_file_get_length
g_mapped_file_get_contents
g_mapped_file_get_bytes

g_open
g_rename
g_mkdir
GStatBuf
g_stat
g_lstat
g_unlink
g_remove
g_rmdir
g_fopen
g_freopen
g_fsync
g_chmod
g_access
g_creat
g_chdir
g_utime
g_close

字符串类
g_strdup
g_strndup
g_strdupv
g_strnfill
g_stpcpy
g_strstr_len
g_strrstr
g_strrstr_len
g_str_has_prefix
g_str_has_suffix
g_strcmp0
g_str_to_ascii
g_str_tokenize_and_fold
g_str_match_string

g_strdup_printf
g_strdup_vprintf
g_printf
g_vprintf
g_fprintf
g_vfprintf
g_sprintf
g_vsprintf
g_snprintf
g_vsnprintf
g_vasprintf
g_printf_string_upper_bound

编码类
g_str_is_ascii
g_ascii_isalnum
g_ascii_isalpha
g_ascii_iscntrl
g_ascii_isdigit
g_ascii_isgraph
g_ascii_islower
g_ascii_isprint
g_ascii_ispunct
g_ascii_isspace
g_ascii_isupper
g_ascii_isxdigit

g_ascii_digit_value
g_ascii_xdigit_value

g_ascii_strcasecmp
g_ascii_strncasecmp

g_ascii_strup
g_ascii_strdown

g_strdelimit
G_STR_DELIMITERS
g_strescape
g_strcompress
g_strcanon
g_strsplit
g_strsplit_set
g_strfreev
g_strconcat
g_strjoin
g_strjoinv

GStrv
GStrvBuilder
g_strv_length
g_strv_contains
g_strv_equal
g_strv_builder_new
g_strv_builder_ref
g_strv_builder_unref
g_strv_builder_add
g_strv_builder_addv
g_strv_builder_add_many
g_strv_builder_end


1.2.18 日期类函数
GDate
GTime
GDateDMY
GDateDay
GDateMonth
GDateYear
GDateWeekday

G_DATE_BAD_DAY
G_DATE_BAD_JULIAN
G_DATE_BAD_YEAR

g_date_new
g_date_new_dmy
g_date_new_julian
g_date_clear
g_date_free
g_date_copy

g_date_set_day
g_date_set_month
g_date_set_year
g_date_set_dmy
g_date_set_julian
g_date_set_time
g_date_set_time_t
g_date_set_time_val
g_date_set_parse

g_date_add_days
g_date_subtract_days
g_date_add_months
g_date_subtract_months
g_date_add_years
g_date_subtract_years
g_date_days_between
g_date_compare
g_date_clamp
g_date_order

1.2.19 互斥锁类函数
GHookList
GHookFinalizeFunc
GHook
GHookFunc
GHookCheckFunc

g_hook_list_init
g_hook_list_invoke
g_hook_list_invoke_check
g_hook_list_marshal
GHookMarshaller
g_hook_list_marshal_check
GHookCheckMarshaller
g_hook_list_clear

g_hook_alloc
g_hook_append
g_hook_prepend
g_hook_insert_before
g_hook_insert_sorted
GHookCompareFunc
g_hook_compare_ids

g_hook_get
g_hook_find
GHookFindFunc
g_hook_find_data
g_hook_find_func
g_hook_find_func_data
1.2.20 用户类函数
g_get_application_name
g_set_application_name
g_get_prgname
g_set_prgname
g_get_environ
g_environ_getenv
g_environ_setenv
g_environ_unsetenv
g_getenv
g_setenv
g_unsetenv
g_listenv
g_get_user_name
g_get_real_name
g_get_user_cache_dir
g_get_user_data_dir
g_get_user_config_dir
g_get_user_state_dir
g_get_user_runtime_dir
GUserDirectory
g_get_user_special_dir
g_get_system_data_dirs
g_get_system_config_dirs
g_reload_user_special_dirs_cache
g_get_os_info

g_get_host_name
g_get_home_dir
g_get_tmp_dir
g_get_current_dir
g_basename
g_dirname
g_canonicalize_filename
g_path_is_absolute
g_path_skip_root
g_path_get_basename
g_path_get_dirname
g_build_filename
g_build_filenamev
g_build_filename_valist
g_build_path
g_build_pathv

g_atexit
g_abort
1.2.21 Scanner类函数
GScanner
GScannerConfig
g_scanner_new
g_scanner_destroy

<SUBSECTION>
g_scanner_input_file
g_scanner_sync_file_offset
g_scanner_input_text
g_scanner_peek_next_token
g_scanner_get_next_token
g_scanner_eof

<SUBSECTION>
g_scanner_cur_line
g_scanner_cur_position
g_scanner_cur_token
g_scanner_cur_value

<SUBSECTION>
g_scanner_set_scope
g_scanner_scope_add_symbol
g_scanner_scope_foreach_symbol
g_scanner_scope_lookup_symbol
g_scanner_scope_remove_symbol
g_scanner_add_symbol
g_scanner_remove_symbol
g_scanner_foreach_symbol

<SUBSECTION>
g_scanner_freeze_symbol_table
g_scanner_thaw_symbol_table
g_scanner_lookup_symbol

<SUBSECTION>
g_scanner_warn
g_scanner_error
g_scanner_unexp_token
GScannerMsgFunc
1.2.22 Key-value file parser类函数
GKeyFile
G_KEY_FILE_ERROR
GKeyFileError
GKeyFileFlags

g_key_file_new
g_key_file_free
g_key_file_ref
g_key_file_unref
g_key_file_set_list_separator
g_key_file_load_from_file
g_key_file_load_from_data
g_key_file_load_from_bytes
g_key_file_load_from_data_dirs
g_key_file_load_from_dirs
g_key_file_to_data
g_key_file_save_to_file
g_key_file_get_start_group
g_key_file_get_groups
g_key_file_get_keys
g_key_file_has_group
g_key_file_has_key

g_key_file_get_value
g_key_file_get_string
g_key_file_get_locale_string
g_key_file_get_locale_for_key
g_key_file_get_boolean
g_key_file_get_integer
g_key_file_get_int64
g_key_file_get_uint64
g_key_file_get_double
g_key_file_get_string_list
g_key_file_get_locale_string_list
g_key_file_get_boolean_list
g_key_file_get_integer_list
g_key_file_get_double_list
g_key_file_get_comment

g_key_file_set_value
g_key_file_set_string
g_key_file_set_locale_string
g_key_file_set_boolean
g_key_file_set_integer
g_key_file_set_int64
g_key_file_set_uint64
g_key_file_set_double
g_key_file_set_string_list
g_key_file_set_locale_string_list
g_key_file_set_boolean_list
g_key_file_set_integer_list
g_key_file_set_double_list
g_key_file_set_comment
g_key_file_remove_group
g_key_file_remove_key
g_key_file_remove_comment

1.2.23 Bookmark file parser类函数
GBookmarkFile
G_BOOKMARK_FILE_ERROR
GBookmarkFileError
g_bookmark_file_new
g_bookmark_file_free
g_bookmark_file_load_from_file
g_bookmark_file_load_from_data
g_bookmark_file_load_from_data_dirs
g_bookmark_file_to_data
g_bookmark_file_to_file
g_bookmark_file_has_item
g_bookmark_file_has_group
g_bookmark_file_has_application
g_bookmark_file_get_size
g_bookmark_file_get_uris G_GNUC_MALLOC

g_bookmark_file_get_title
g_bookmark_file_get_description
g_bookmark_file_get_mime_type
g_bookmark_file_get_is_private
g_bookmark_file_get_icon
g_bookmark_file_get_added
g_bookmark_file_get_added_date_time
g_bookmark_file_get_modified
g_bookmark_file_get_modified_date_time
g_bookmark_file_get_visited
g_bookmark_file_get_visited_date_time
g_bookmark_file_get_groups
g_bookmark_file_get_applications
g_bookmark_file_get_app_info
g_bookmark_file_get_application_info

g_bookmark_file_set_title
g_bookmark_file_set_description
g_bookmark_file_set_mime_type
g_bookmark_file_set_is_private
g_bookmark_file_set_icon
g_bookmark_file_set_added
g_bookmark_file_set_added_date_time
g_bookmark_file_set_groups
g_bookmark_file_set_modified
g_bookmark_file_set_modified_date_time
g_bookmark_file_set_visited
g_bookmark_file_set_visited_date_time
g_bookmark_file_set_app_info
g_bookmark_file_set_application_info
g_bookmark_file_add_group
g_bookmark_file_add_application
g_bookmark_file_remove_group
g_bookmark_file_remove_application
g_bookmark_file_remove_item
g_bookmark_file_move_item

1.2.24 Dynamic Loading of Modules类函数
GModule
GModuleError
G_MODULE_ERROR
g_module_supported
g_module_build_path
g_module_open
g_module_open_full
GModuleFlags
g_module_symbol
g_module_name
g_module_make_resident
g_module_close
g_module_error

GModuleCheckInit
GModuleUnload
G_MODULE_SUFFIX
G_MODULE_EXPORT
G_MODULE_IMPORT
1.2.25 双向链表类函数
g_list_append
g_list_prepend
g_list_insert
g_list_insert_before
g_list_insert_before_link
g_list_insert_sorted
g_list_remove
g_list_remove_link
g_list_delete_link
g_list_remove_all
g_list_free
g_list_free_full
g_clear_list

g_list_alloc
g_list_free_1
g_list_free1

g_list_length
g_list_copy
g_list_copy_deep
g_list_reverse
g_list_sort
GCompareFunc
g_list_insert_sorted_with_data
g_list_sort_with_data
GCompareDataFunc
g_list_concat
g_list_foreach

g_list_first
g_list_last
g_list_previous
g_list_next
g_list_nth
g_list_nth_data
g_list_nth_prev

g_list_find
g_list_find_custom
g_list_position
g_list_index
1.2.26 单向链表类函数
g_slist_alloc
g_slist_append
g_slist_prepend
g_slist_insert
g_slist_insert_before
g_slist_insert_sorted
g_slist_remove
g_slist_remove_link
g_slist_delete_link
g_slist_remove_all
g_slist_free
g_slist_free_full
g_slist_free_1
g_slist_free1
g_clear_slist

g_slist_length
g_slist_copy
g_slist_copy_deep
g_slist_reverse
g_slist_insert_sorted_with_data
g_slist_sort
g_slist_sort_with_data
g_slist_concat
g_slist_foreach

g_slist_last
g_slist_next
g_slist_nth
g_slist_nth_data


g_slist_find
g_slist_find_custom
g_slist_position
g_slist_index
1.2.27 双头队列类函数
g_queue_new
g_queue_free
g_queue_free_full
G_QUEUE_INIT
g_queue_init
g_queue_clear
g_queue_clear_full
g_queue_is_empty
g_queue_get_length
g_queue_reverse
g_queue_copy
g_queue_foreach
g_queue_find
g_queue_find_custom
g_queue_sort
g_queue_push_head
g_queue_push_tail
g_queue_push_nth
g_queue_pop_head
g_queue_pop_tail
g_queue_pop_nth
g_queue_peek_head
g_queue_peek_tail
g_queue_peek_nth
g_queue_index
g_queue_remove
g_queue_remove_all
g_queue_insert_before
g_queue_insert_before_link
g_queue_insert_after
g_queue_insert_after_link
g_queue_insert_sorted
g_queue_push_head_link
g_queue_push_tail_link
g_queue_push_nth_link
g_queue_pop_head_link
g_queue_pop_tail_link
g_queue_pop_nth_link
g_queue_peek_head_link
g_queue_peek_tail_link
g_queue_peek_nth_link
g_queue_link_index
g_queue_unlink
g_queue_delete_link
1.2.28 单头队列类函数
GSequence
GSequenceIter
GSequenceIterCompareFunc

<SUBSECTION>
g_sequence_new
g_sequence_free
g_sequence_get_length
g_sequence_is_empty
g_sequence_foreach
g_sequence_foreach_range
g_sequence_sort
g_sequence_sort_iter

<SUBSECTION>
g_sequence_get_begin_iter
g_sequence_get_end_iter
g_sequence_get_iter_at_pos
g_sequence_append
g_sequence_prepend
g_sequence_insert_before
g_sequence_move
g_sequence_swap
g_sequence_insert_sorted
g_sequence_insert_sorted_iter
g_sequence_sort_changed
g_sequence_sort_changed_iter
g_sequence_remove
g_sequence_remove_range
g_sequence_move_range
g_sequence_search
g_sequence_search_iter
g_sequence_lookup
g_sequence_lookup_iter

<SUBSECTION>
g_sequence_get
g_sequence_set

<SUBSECTION>
g_sequence_iter_is_begin
g_sequence_iter_is_end
g_sequence_iter_next
g_sequence_iter_prev
g_sequence_iter_get_position
g_sequence_iter_move
g_sequence_iter_get_sequence
1.2.29 栈类函数
GTrashStack

g_trash_stack_push
g_trash_stack_pop
g_trash_stack_peek
g_trash_stack_height
1.2.30 哈希类函数
GHashTable
g_hash_table_new
g_hash_table_new_full
g_hash_table_new_similar
GHashFunc
GEqualFunc
GEqualFuncFull
g_hash_table_insert
g_hash_table_replace
g_hash_table_add
g_hash_table_contains
g_hash_table_size
g_hash_table_lookup
g_hash_table_lookup_extended
g_hash_table_foreach
g_hash_table_find
GHFunc
g_hash_table_remove
g_hash_table_steal
g_hash_table_steal_extended
g_hash_table_foreach_remove
g_hash_table_foreach_steal
g_hash_table_remove_all
g_hash_table_steal_all
g_hash_table_get_keys
g_hash_table_get_values
g_hash_table_get_keys_as_array
GHRFunc
g_hash_table_freeze
g_hash_table_thaw
g_hash_table_destroy
g_hash_table_ref
g_hash_table_unref
GHashTableIter
g_hash_table_iter_init
g_hash_table_iter_next
g_hash_table_iter_get_hash_table
g_hash_table_iter_replace
g_hash_table_iter_remove
g_hash_table_iter_steal

g_direct_equal
g_direct_hash
g_int_equal
g_int_hash
g_int64_equal
g_int64_hash
g_double_equal
g_double_hash
g_str_equal
g_str_hash
1.2.31 字符串类函数
GString
g_string_new
g_string_new_len
g_string_sized_new
g_string_assign
g_string_sprintf
g_string_sprintfa
g_string_vprintf
g_string_append_vprintf
g_string_printf
g_string_append_printf
g_string_append
g_string_append_c
g_string_append_unichar
g_string_append_len
g_string_append_uri_escaped
g_string_prepend
g_string_prepend_c
g_string_prepend_unichar
g_string_prepend_len
g_string_insert
g_string_insert_c
g_string_insert_unichar
g_string_insert_len
g_string_overwrite
g_string_overwrite_len
g_string_replace
g_string_erase
g_string_truncate
g_string_set_size
g_string_free
g_string_free_to_bytes
1.2.32 字符串块类函数
GStringChunk
g_string_chunk_new
g_string_chunk_insert
g_string_chunk_insert_const
g_string_chunk_insert_len
g_string_chunk_clear
g_string_chunk_free
1.2.33 Arrays类函数
GArray
g_array_new
g_array_steal
g_array_sized_new
g_array_copy
g_array_ref
g_array_unref
g_array_get_element_size
g_array_append_val
g_array_append_vals
g_array_prepend_val
g_array_prepend_vals
g_array_insert_val
g_array_insert_vals
g_array_remove_index
g_array_remove_index_fast
g_array_remove_range
g_array_sort
g_array_sort_with_data
g_array_binary_search
g_array_index
g_array_set_size
g_array_set_clear_func
g_array_free
1.2.34 指针数组类函数
GPtrArray
g_ptr_array_new
g_ptr_array_steal
g_ptr_array_sized_new
g_ptr_array_new_with_free_func
g_ptr_array_copy
g_ptr_array_new_full
g_ptr_array_set_free_func
g_ptr_array_ref
g_ptr_array_unref
g_ptr_array_add
g_ptr_array_extend
g_ptr_array_extend_and_steal
g_ptr_array_insert
g_ptr_array_remove
g_ptr_array_remove_index
g_ptr_array_remove_fast
g_ptr_array_remove_index_fast
g_ptr_array_remove_range
g_ptr_array_steal_index
g_ptr_array_steal_index_fast
g_ptr_array_sort
g_ptr_array_sort_with_data
g_ptr_array_set_size
g_ptr_array_index
g_ptr_array_free
g_ptr_array_foreach
g_ptr_array_find
g_ptr_array_find_with_equal_func
1.2.35 Byte Arrays类函数
GByteArray
g_byte_array_new
g_byte_array_steal
g_byte_array_new_take
g_byte_array_sized_new
g_byte_array_ref
g_byte_array_unref
g_byte_array_append
g_byte_array_prepend
g_byte_array_remove_index
g_byte_array_remove_index_fast
g_byte_array_remove_range
g_byte_array_sort
g_byte_array_sort_with_data
g_byte_array_set_size
g_byte_array_free
g_byte_array_free_to_bytes
1.2.36 Byte类函数
GBytes
g_bytes_new
g_bytes_new_take
g_bytes_new_static
g_bytes_new_with_free_func
g_bytes_new_from_bytes
g_bytes_get_data
g_bytes_get_region
g_bytes_get_size
g_bytes_hash
g_bytes_equal
g_bytes_compare
g_bytes_ref
g_bytes_unref
g_bytes_unref_to_data
g_bytes_unref_to_array
1.2.37 Tree类函数
GTree
GTreeNode
g_tree_new
g_tree_ref
g_tree_unref
g_tree_new_with_data
g_tree_new_full
g_tree_node_first
g_tree_node_last
g_tree_node_previous
g_tree_node_next
g_tree_insert_node
g_tree_insert
g_tree_replace_node
g_tree_replace
g_tree_node_key
g_tree_node_value
g_tree_nnodes
g_tree_height
g_tree_lookup_node
g_tree_lookup
g_tree_lookup_extended
g_tree_foreach_node
g_tree_foreach
g_tree_traverse
GTraverseFunc
GTraverseNodeFunc
g_tree_search_node
g_tree_search
g_tree_lower_bound
g_tree_upper_bound
g_tree_remove
g_tree_steal
g_tree_remove_all
g_tree_destroy
1.2.38 N-ary Trees类函数
GNode
g_node_new
g_node_copy
GCopyFunc
g_node_copy_deep

<SUBSECTION>
g_node_insert
g_node_insert_before
g_node_insert_after
g_node_append
g_node_prepend

<SUBSECTION>
g_node_insert_data
g_node_insert_data_after
g_node_insert_data_before
g_node_append_data
g_node_prepend_data

<SUBSECTION>
g_node_reverse_children
g_node_traverse
GTraverseType
GTraverseFlags
GNodeTraverseFunc
g_node_children_foreach
GNodeForeachFunc

<SUBSECTION>
g_node_get_root
g_node_find
g_node_find_child
g_node_child_index
g_node_child_position
g_node_first_child
g_node_last_child
g_node_nth_child
g_node_first_sibling
g_node_next_sibling
g_node_prev_sibling
g_node_last_sibling

<SUBSECTION>
G_NODE_IS_LEAF
G_NODE_IS_ROOT
g_node_depth
g_node_n_nodes
g_node_n_children
g_node_is_ancestor
g_node_max_height
1.2.39 Quarks类函数
GQuark
G_DEFINE_QUARK
g_quark_from_string
g_quark_from_static_string
g_quark_to_string
g_quark_try_string
g_intern_string
g_intern_static_string
1.2.40 datalist类函数
g_datalist_id_set_data
g_datalist_id_set_data_full
g_datalist_id_get_data
g_datalist_id_remove_data
g_datalist_id_remove_no_notify
GDuplicateFunc
g_datalist_id_dup_data
g_datalist_id_replace_data

<SUBSECTION>
g_datalist_set_data
g_datalist_set_data_full
g_datalist_get_data
g_datalist_remove_data
g_datalist_remove_no_notify

<SUBSECTION>
g_datalist_foreach
g_datalist_clear
g_datalist_set_flags
g_datalist_unset_flags
g_datalist_get_flags
G_DATALIST_FLAGS_MASK
1.2.41 Datasets类函数
g_dataset_id_set_data
g_dataset_id_set_data_full
GDestroyNotify
g_dataset_id_get_data
g_dataset_id_remove_data
g_dataset_id_remove_no_notify

<SUBSECTION>
g_dataset_set_data
g_dataset_set_data_full
g_dataset_get_data
g_dataset_remove_data
g_dataset_remove_no_notify

<SUBSECTION>
g_dataset_foreach
GDataForeachFunc
g_dataset_destroy
1.2.42 Tuples类函数
GRelation
g_relation_new
g_relation_index
g_relation_insert
g_relation_exists
g_relation_count
g_relation_select
g_relation_delete
g_relation_destroy
1.2.43 Caches类函数
GCache
g_cache_new
g_cache_insert
g_cache_remove
g_cache_destroy

g_cache_key_foreach
g_cache_value_foreach

GCacheDestroyFunc
GCacheDupFunc
GCacheNewFunc
1.2.44 Random类函数
GRand
g_rand_new_with_seed
g_rand_new_with_seed_array
g_rand_new
g_rand_copy
g_rand_free
g_rand_set_seed
g_rand_set_seed_array
g_rand_boolean
g_rand_int
g_rand_int_range
g_rand_double
g_rand_double_range
g_random_set_seed
g_random_boolean
g_random_int
g_random_int_range
g_random_double
g_random_double_range
1.2.45 Character Set Conversion类函数
g_convert
g_convert_with_fallback
GIConv
g_convert_with_iconv
G_CONVERT_ERROR
g_iconv_open
g_iconv
g_iconv_close
g_locale_to_utf8
g_filename_to_utf8
g_filename_from_utf8
g_get_filename_charsets
g_filename_display_name
g_filename_display_basename
g_locale_from_utf8
1.2.46 Unicode Manipulation类函数
g_unichar_validate
g_unichar_isalnum
g_unichar_isalpha
g_unichar_iscntrl
g_unichar_isdefined
g_unichar_isdigit
g_unichar_isgraph
g_unichar_islower
g_unichar_ismark
g_unichar_isprint
g_unichar_ispunct
g_unichar_isspace
g_unichar_istitle
g_unichar_isupper
g_unichar_isxdigit
g_unichar_iswide
g_unichar_iswide_cjk
g_unichar_iszerowidth
g_unichar_toupper
g_unichar_tolower
g_unichar_totitle
g_unichar_digit_value
g_unichar_xdigit_value
g_unichar_compose
g_unichar_decompose
g_unichar_fully_decompose
G_UNICHAR_MAX_DECOMPOSITION_LENGTH
GUnicodeType
G_UNICODE_COMBINING_MARK
g_unichar_type
GUnicodeBreakType
g_unichar_break_type
g_unichar_combining_class
g_unicode_canonical_ordering
g_unicode_canonical_decomposition
g_unichar_get_mirror_char
GUnicodeScript
g_unichar_get_script
g_unicode_script_from_iso15924
g_unicode_script_to_iso15924

<SUBSECTION>
g_utf8_next_char
g_utf8_get_char
g_utf8_get_char_validated
g_utf8_offset_to_pointer
g_utf8_pointer_to_offset
g_utf8_prev_char
g_utf8_find_next_char
g_utf8_find_prev_char
g_utf8_strlen
g_utf8_strncpy
g_utf8_strchr
g_utf8_strrchr
g_utf8_strreverse
g_utf8_substring
g_utf8_validate
g_utf8_validate_len
g_utf8_make_valid

<SUBSECTION>
g_utf8_strup
g_utf8_strdown
g_utf8_casefold
g_utf8_normalize
GNormalizeMode
g_utf8_collate
g_utf8_collate_key
g_utf8_collate_key_for_filename

<SUBSECTION>
g_utf8_to_utf16
g_utf8_to_ucs4
g_utf8_to_ucs4_fast
g_utf16_to_ucs4
g_utf16_to_utf8
g_ucs4_to_utf16
g_ucs4_to_utf8
g_unichar_to_utf8
1.2.47 Base64 Encoding类函数
g_base64_encode_step
g_base64_encode_close
g_base64_encode
g_base64_decode_step
g_base64_decode
g_base64_decode_inplace
1.2.48 URI Functions类函数
GUri
g_uri_ref
g_uri_unref
<SUBSECTION>
GUriFlags
g_uri_split
g_uri_split_with_user
g_uri_split_network
g_uri_is_valid
g_uri_join
g_uri_join_with_user
g_uri_parse
g_uri_parse_relative
g_uri_resolve_relative
g_uri_build
g_uri_build_with_user
g_uri_peek_scheme
g_uri_parse_scheme
<SUBSECTION>
GUriHideFlags
g_uri_to_string
g_uri_to_string_partial
<SUBSECTION>
g_uri_get_scheme
g_uri_get_userinfo
g_uri_get_user
g_uri_get_password
g_uri_get_auth_params
g_uri_get_host
g_uri_get_port
g_uri_get_path
g_uri_get_query
g_uri_get_fragment
g_uri_get_flags
<SUBSECTION>
GUriParamsIter
GUriParamsFlags
g_uri_params_iter_init
g_uri_params_iter_next
g_uri_parse_params
<SUBSECTION>
G_URI_RESERVED_CHARS_ALLOWED_IN_PATH
G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT
G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO
G_URI_RESERVED_CHARS_GENERIC_DELIMITERS
G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS
g_uri_escape_string
g_uri_unescape_string
g_uri_escape_bytes
g_uri_unescape_bytes
g_uri_unescape_segment
<SUBSECTION>
g_uri_list_extract_uris
g_filename_from_uri
g_filename_to_uri
<SUBSECTION>
G_URI_ERROR
GUriError
<SUBSECTION Private>
g_uri_error_quark
1.2.49 Data Checksums类函数(校验和)
GChecksumType
g_checksum_type_get_length
GChecksum
g_checksum_new
g_checksum_copy
g_checksum_free
g_checksum_reset
g_checksum_update
g_checksum_get_string
g_checksum_get_digest
<SUBSECTION>
g_compute_checksum_for_data
g_compute_checksum_for_string
g_compute_checksum_for_bytes
1.2.50 Data HMACs类函数(加密)
GHmac
g_hmac_new
g_hmac_copy
g_hmac_ref
g_hmac_unref
g_hmac_update
g_hmac_get_string
g_hmac_get_digest
<SUBSECTION>
g_compute_hmac_for_data
g_compute_hmac_for_string
g_compute_hmac_for_bytes
1.2.51 Testing类函数
G_TEST_OPTION_ISOLATE_DIRS
g_test_minimized_result
g_test_maximized_result
g_test_init
g_test_initialized
g_test_quick
g_test_slow
g_test_thorough
g_test_perf
g_test_verbose
g_test_undefined
g_test_quiet
g_test_subprocess
g_test_run
GTestFunc
g_test_add_func
GTestDataFunc
g_test_add_data_func
g_test_add_data_func_full
g_test_add
g_test_get_path

GTestFileType
g_test_build_filename
g_test_get_filename
g_test_get_dir

g_test_fail
g_test_fail_printf
g_test_skip
g_test_skip_printf
g_test_incomplete
g_test_incomplete_printf
g_test_failed
g_test_message
g_test_bug_base
g_test_bug
g_test_summary
GTestLogFatalFunc
g_test_log_set_fatal_handler

g_test_timer_start
g_test_timer_elapsed
g_test_timer_last

g_test_queue_free
g_test_queue_destroy
g_test_queue_unref

g_test_expect_message
g_test_assert_expected_messages

GTestTrapFlags
GTestSubprocessFlags
g_test_trap_subprocess
g_test_trap_has_passed
g_test_trap_reached_timeout
g_test_trap_assert_passed
g_test_trap_assert_failed
g_test_trap_assert_stdout
g_test_trap_assert_stdout_unmatched
g_test_trap_assert_stderr
g_test_trap_assert_stderr_unmatched
g_test_trap_fork

g_test_rand_bit
g_test_rand_int
g_test_rand_int_range
g_test_rand_double
g_test_rand_double_range

g_assert
g_assert_not_reached

g_assert_cmpstr
g_assert_cmpstrv
g_assert_cmpint
g_assert_cmpuint
g_assert_cmphex
g_assert_cmpfloat
g_assert_cmpfloat_with_epsilon
g_assert_cmpmem
g_assert_cmpvariant
g_assert_no_error
g_assert_error
g_assert_true
g_assert_false
g_assert_null
g_assert_nonnull
g_assert_no_errno
g_test_set_nonfatal_assertions

GTestCase
GTestSuite
GTestFixtureFunc
g_test_create_case
g_test_create_suite
g_test_get_root
g_test_suite_add
g_test_suite_add_suite
g_test_run_suite
g_test_case_free
g_test_suite_free

<SUBSECTION Private>
g_test_trap_assertions
g_assertion_message
g_assertion_message_expr
g_assertion_message_cmpstr
g_assertion_message_cmpnum
g_assertion_message_error
g_test_assert_expected_messages_internal

g_test_config_vars

g_test_add_vtable
GTestConfig
GTestLogType
GTestLogMsg
GTestLogBuffer
GTestResult

g_test_log_type_name
g_test_log_buffer_new
g_test_log_buffer_free
g_test_log_buffer_push
g_test_log_buffer_pop
g_test_log_msg_free
1.2.52 GVariantType类函数
GVariantType
G_VARIANT_TYPE_BOOLEAN
G_VARIANT_TYPE_BYTE
G_VARIANT_TYPE_INT16
G_VARIANT_TYPE_UINT16
G_VARIANT_TYPE_INT32
G_VARIANT_TYPE_UINT32
G_VARIANT_TYPE_INT64
G_VARIANT_TYPE_UINT64
G_VARIANT_TYPE_HANDLE
G_VARIANT_TYPE_DOUBLE
G_VARIANT_TYPE_STRING
G_VARIANT_TYPE_OBJECT_PATH
G_VARIANT_TYPE_SIGNATURE
G_VARIANT_TYPE_VARIANT
G_VARIANT_TYPE_ANY
G_VARIANT_TYPE_BASIC
G_VARIANT_TYPE_MAYBE
G_VARIANT_TYPE_ARRAY
G_VARIANT_TYPE_TUPLE
G_VARIANT_TYPE_UNIT
G_VARIANT_TYPE_DICT_ENTRY
G_VARIANT_TYPE_DICTIONARY
G_VARIANT_TYPE_STRING_ARRAY
G_VARIANT_TYPE_OBJECT_PATH_ARRAY
G_VARIANT_TYPE_BYTESTRING
G_VARIANT_TYPE_BYTESTRING_ARRAY
G_VARIANT_TYPE_VARDICT

<SUBSECTION>
G_VARIANT_TYPE
g_variant_type_free
g_variant_type_copy
g_variant_type_new

<SUBSECTION>
g_variant_type_string_is_valid
g_variant_type_string_scan
g_variant_type_get_string_length
g_variant_type_peek_string
g_variant_type_dup_string

<SUBSECTION>
g_variant_type_is_definite
g_variant_type_is_container
g_variant_type_is_basic
g_variant_type_is_maybe
g_variant_type_is_array
g_variant_type_is_tuple
g_variant_type_is_dict_entry
g_variant_type_is_variant

<SUBSECTION>
g_variant_type_hash
g_variant_type_equal
g_variant_type_is_subtype_of

<SUBSECTION>
g_variant_type_new_maybe
g_variant_type_new_array
g_variant_type_new_tuple
g_variant_type_new_dict_entry

<SUBSECTION>
g_variant_type_element
g_variant_type_n_items
g_variant_type_first
g_variant_type_next
g_variant_type_key
g_variant_type_value
</SECTION>

<SECTION>
<TITLE>GVariant</TITLE>
<FILE>gvariant</FILE>
GVariant
g_variant_unref
g_variant_ref
g_variant_ref_sink
g_variant_is_floating
g_variant_take_ref
g_variant_get_type
g_variant_get_type_string
g_variant_is_of_type
g_variant_is_container
g_variant_compare

<SUBSECTION>
g_variant_classify
GVariantClass

<SUBSECTION>
g_variant_check_format_string
g_variant_get
g_variant_get_va
g_variant_new
g_variant_new_va

<SUBSECTION>
g_variant_new_boolean
g_variant_new_byte
g_variant_new_int16
g_variant_new_uint16
g_variant_new_int32
g_variant_new_uint32
g_variant_new_int64
g_variant_new_uint64
g_variant_new_handle
g_variant_new_double
g_variant_new_string
g_variant_new_take_string
g_variant_new_printf
g_variant_new_object_path
g_variant_is_object_path
g_variant_new_signature
g_variant_is_signature
g_variant_new_variant
g_variant_new_strv
g_variant_new_objv
g_variant_new_bytestring
g_variant_new_bytestring_array

<SUBSECTION>
g_variant_get_boolean
g_variant_get_byte
g_variant_get_int16
g_variant_get_uint16
g_variant_get_int32
g_variant_get_uint32
g_variant_get_int64
g_variant_get_uint64
g_variant_get_handle
g_variant_get_double
g_variant_get_string
g_variant_dup_string
g_variant_get_variant
g_variant_get_strv
g_variant_dup_strv
g_variant_get_objv
g_variant_dup_objv
g_variant_get_bytestring
g_variant_dup_bytestring
g_variant_get_bytestring_array
g_variant_dup_bytestring_array

<SUBSECTION>
g_variant_new_maybe
g_variant_new_array
g_variant_new_tuple
g_variant_new_dict_entry
g_variant_new_fixed_array

<SUBSECTION>
g_variant_get_maybe
g_variant_n_children
g_variant_get_child_value
g_variant_get_child
g_variant_lookup_value
g_variant_lookup
g_variant_get_fixed_array

<SUBSECTION>
g_variant_get_size
g_variant_get_data
g_variant_get_data_as_bytes
g_variant_store
g_variant_new_from_data
g_variant_new_from_bytes
g_variant_byteswap
g_variant_get_normal_form
g_variant_is_normal_form

<SUBSECTION>
g_variant_hash
g_variant_equal

<SUBSECTION>
g_variant_print
g_variant_print_string

<SUBSECTION>
GVariantIter
g_variant_iter_copy
g_variant_iter_free
g_variant_iter_init
g_variant_iter_n_children
g_variant_iter_new
g_variant_iter_next_value
g_variant_iter_next
g_variant_iter_loop

<SUBSECTION>
G_VARIANT_BUILDER_INIT
GVariantBuilder
g_variant_builder_unref
g_variant_builder_ref
g_variant_builder_new
g_variant_builder_init
g_variant_builder_clear
g_variant_builder_add_value
g_variant_builder_add
g_variant_builder_add_parsed
g_variant_builder_end
g_variant_builder_open
g_variant_builder_close

<SUBSECTION>
G_VARIANT_DICT_INIT
GVariantDict
g_variant_dict_unref
g_variant_dict_ref
g_variant_dict_new
g_variant_dict_init
g_variant_dict_clear
g_variant_dict_contains
g_variant_dict_lookup
g_variant_dict_lookup_value
g_variant_dict_insert
g_variant_dict_insert_value
g_variant_dict_remove
g_variant_dict_end

<SUBSECTION>
GVariantParseError
G_VARIANT_PARSE_ERROR
g_variant_parse
g_variant_new_parsed_va
g_variant_new_parsed
g_variant_parse_error_print_context

<SUBSECTION Private>
g_variant_parse_error_quark
g_variant_parser_get_error_quark
g_variant_type_checked_
g_variant_type_string_get_depth_
1.2.53 ghostutils类函数
g_hostname_to_ascii
g_hostname_to_unicode
<SUBSECTION>
g_hostname_is_non_ascii
g_hostname_is_ascii_encoded
<SUBSECTION>
g_hostname_is_ip_address
1.2.54 uuid类函数
g_uuid_string_is_valid
g_uuid_string_random
1.2.55 refcount类函数(引用计数器)
grefcount
g_ref_count_init
g_ref_count_inc
g_ref_count_dec
g_ref_count_compare
<SUBSECTION>
gatomicrefcount
g_atomic_ref_count_init
g_atomic_ref_count_inc
g_atomic_ref_count_dec
1.2.56 rcbox类函数
g_rc_box_alloc
g_rc_box_alloc0
g_rc_box_new
g_rc_box_new0
g_rc_box_dup
g_rc_box_acquire
g_rc_box_release
g_rc_box_release_full
g_rc_box_get_size
1.2.57 arcbox类函数
g_atomic_rc_box_alloc
g_atomic_rc_box_alloc0
g_atomic_rc_box_new
g_atomic_rc_box_new0
g_atomic_rc_box_dup
g_atomic_rc_box_acquire
g_atomic_rc_box_release
g_atomic_rc_box_release_full
g_atomic_rc_box_get_size
1.2.58 refstring类函数
GRefString
g_ref_string_new
g_ref_string_new_intern
g_ref_string_new_len
g_ref_string_acquire
g_ref_string_release
g_ref_string_length

二、gio

(略)

三、gobject

三、meson管理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GLib学习 的相关文章

  • logging模块学习

    logging 基础知识 logging的基础知识 logging basicConfig 参数介绍 filename 创建一个 FileHandler 使用指定的文件名 而不是使用 StreamHandler filemode 如果指明了
  • go socket编程

    8 1 Socket编程 在很多底层网络应用开发者的眼里一切编程都是Socket 话虽然有点夸张 但却也几乎如此了 现在的网络编程几乎都是用Socket来编程 你想过这些情景么 我们每天打开浏览器浏览网页时 浏览器进程怎么和Web服务器进行
  • kafka查询指定消费Group未消费的数据

    最近线上出现kafka生产者发送成功了 但是消费者没有拉取到 出现这种现象是偶发的 就是在几分钟内有几个消息没消费到 后面就没再出现过 首先先去卡夫卡上确认是否有消息堆积 下载kafka 不是src版的哦 http kafka apache
  • SQl CASE WHEN 语句的嵌套使用方式

    select id userid ys case when pj ys is NULL then case when pj ys1 is NUll then ys else pj ys1 end else pj ys end t from

随机推荐

  • 技巧分享篇---如何从GitHub上下载某个项目中单个文件的方法

    前言 梦想就是一种让你感到坚持就是幸福的东西 技巧分享篇 如何从GitHub上下载某个项目中单个文件的方法 一 Github项目里的单个js文件下载实例演示 1 点击查看文件 2 点击源码 Raw 3 通过 ctrl s 保存即可 二 Gi
  • Obsidian利用插件Remotely-save实现超低成本全平台云笔记

    Obsidian作为一个笔记软件 是目前最满足我需求的了 本地存储文件 Markdown格式作为基础 双链支持 以及好用的搜索等功能 基本实现了我对一款文字笔记软件的要求 但是Obsidian的收费价格确实不低 虽然软件本身的所有功能基本免
  • Visual Unit 简明教程

    载自 http www vckbase com index php wv 1270 VU1 0 简介 Visual Unit 简称VU 是新一代单元测试工具 功能强大 使用简单 完全可视化 不需编写测试代码 VU的测试结果使程序行为一目了然
  • UNIX系统被删文件的恢复策略

    与DOS Windows不同 UNIX文件被删除后很难恢复 这是由UNIX独特 的文件系统结构决定的 UNIX文件目录不像DOS Windows那样 文 件即使被删除之后仍保存有完整的文件名 文件长度 始簇号 即 文件占有的第一个磁盘块号
  • TTF、TOF、WOFF 和 WOFF2 的相关概念

    前言 在上一篇文章中 我引入了 TTF 格式的字体文件来解决各平台字体表现不统一的问题 但其实那不是最优解决方案 因为字体文件不止有 TTF 格式 常见的字体格式还有 OTF WOFF 和 WOFF2 等 今天 我来总结一下最常见字体格式的
  • Bootstarp学习教程(14) 其他相关组件(2)

    页面标题 简单的h1样式 可以适当地分出空间且分开页面中的章节 像其它组件一样 它可以使用h1的默认small元素 div class page header h1 Example page header h1 div
  • 【Web前端】彼岸の花——网上花店(网页制作)

    本篇博客我们来做一个好看又简单的前端案例 彼岸的花网页界面 这里是代码和网页素材 需要的自取 提取码 7777 https pan baidu com s 1PH0TCuLpapPlJnczDcGkig pwd 7777 at 166988
  • 面经获取

    分享下面文字和图片到朋友圈或者QQ空间 所有人可见 不能是小号 时间保留一天 或者发一个大于100人的群聊保留2分钟以上也行 但你如果发群里可能会被踢 提醒你一下 时间到了截图即可 面经整理不易 大家不要作弊啊 如果有父母啥的不能看 那么你
  • linux ssh出现Unable to negotiate with 192.168.1.1 port 22: no matching cipher found. Their offer......

    问题描述 linux ssh出现Unable to negotiate with 192 168 1 1 port 22 no matching cipher found Their offer aes128 cbc des cbc 解决办
  • VS2019安装配置QT插件(qt-vsaddin)

    1 介绍 Windows的Qt开发 一般采用Visual Studio安装Qt插件的方法开发Qt程序 毕竟VS开发工具还是比QtCreator开发工具强大 好用的多 本教程采用VS2019安装配置Qt插件 qt vsaddin msvc20
  • SpringMVC 从入门到精通系列 03 —— 常用注解

    文章目录 1 RequestParam 注解 2 RequestBody 注解 3 PathVariable 注解 4 RequestHeader 注解 了解 5 CookieValue 注解 了解 6 ModelAttribute 注解
  • Vuex常见面试题

    1 vuex是什么 怎么使用 哪种功能场景使用它 Vuex 是一个专为 Vue js 应用程序开发的状态管理插件 公共数据库 当项目遇到以下两种场景时 1 多个组件依赖于同一状态时 2 来自不同组件的行为需要变更同一状态 解决的问题 多个视
  • Python北理工_turtle绘画

    模块1 turtle库的使用 海龟绘图法 turtle setup 调整绘图窗体在电脑屏幕中的布局 空间坐标系 角度坐标系 代码示例 import turtle turtle left 45 turtle fd 150 turtle rig
  • C++11中std::condition_variable的使用

  • Java中如何创建一个枚举Enum类

    从jdk5出现了枚举类后 定义一些字典值可以使用枚举类型 枚举常用的方法是 values 对枚举中的常量值进行遍历 valueof String name 根据名称获取枚举类中定义的常量值 要求字符串跟枚举的常量名必须一致 获取枚举类中的常
  • Node创建应用

    github地址 https github com lily1010 Node learn tree master test 一 使用node的意义 使用 Node js 时 我们不仅仅 在实现一个JS应用 同时还实现了整个 HTTP 服务
  • 国际版阿里云/腾讯云免费:阿里云产品-弹性核算简介(依据官网转载)

    阿里云产品 弹性核算简介 依据官网转载 云服务器ECS Elastic Compute Service 是阿里云供给的功能杰出 安稳牢靠 弹性扩展的IaaS Infrastructure as a Service 等级云核算服务 实例 等同
  • Java复习-16-多态性

    多态性 在Java中对于多态性有两种实现的模式 方法的多态性 方法的重载 同一个方法名称可以根据传入的参数类型和个数的不同 进行不同的处理 方法的覆写 同一个方法可能根据使用子类的不同 由不同的实现 对象的多态性 父子实例之间的转换处理 有
  • 机器学习类比赛中经常用到的一些函数和知识点

    文章目录 豆瓣 清华源命令 pip升级命令 画图plot汉字显示不出 python控制台打印结果省略的问题 enumerate pandas描述数据基本分布情况 isin 判断值是否存在 某两个特征之间的关联性 np corrcoef fo
  • GLib学习

    Gstreamer 基础 学习博客 一 glib glib介绍 1 1 类型介绍 glib的类型定义在gtypes h文件中 关键定义如下 1 1 1 不规则类型 gboolean gpointer gconstpointer gchar