次の関数を使用して、ユーザーに自動通知を行います。
#define LOG(...) logger((sizeof((int32_t[]){0, ## __VA_ARGS__})/sizeof(int32_t)-1), __VA_ARGS__)
..................
void informer(int32_t count, ...)
{
GtkTreeModel *model = 0;
GtkTreeIter iter;
model = gtk_tree_view_get_model(GUI.log_view);
gtk_list_store_append(GTK_LIST_STORE(model), &iter);
char log_body[16384] = {0};
/* Add current time */
GDateTime *now;
char *time;
now = g_date_time_new_now_local ();
time = g_date_time_format (now, "%c");
g_date_time_unref (now);
gtk_list_store_set(GTK_LIST_STORE(model), &iter, LOG_TIME, time, -1);
free(time);
/* Parse input data*/
va_list ap;
va_start(ap, count);
while (count--) {
if(!count)
{
enum error_type type = va_arg(ap, int);
if(type == OK)
{
gtk_list_store_set(GTK_LIST_STORE(model), &iter, LOG_TYPE, "OK", -1);
}
.............................................
else
{
gtk_list_store_set(GTK_LIST_STORE(model), &iter, LOG_TYPE, "Неизв.", -1);
}
break;
}
char* arg = va_arg(ap, char*);
strcat(log_body," ");
strcat(log_body,arg);
}
va_end(ap);
gtk_list_store_set(GTK_LIST_STORE(model), &iter, LOG_BODY, log_body, -1);
}
だからそのような電話で
LOG("Unknown error", "Error!", ERROR);
ここで、ERROR は列挙型で、gcc はコンパイル中に警告を表示します。
警告: ('(anonymous)[1]' の初期化に近い)
警告: 初期化により、キャストなしでポインターから整数が作成されます [デフォルトで有効]
警告: ('(anonymous)[2]' の初期化に近い)
警告: 初期化により整数になりますキャストなしのポインターから [デフォルトで有効]
警告: ('(anonymous)[3]' の初期化の近く)
警告: 初期化により、キャストなしでポインターから整数が作成されます [デフォルトで有効]
コードは完全に機能しますが、これは実際には安全ですか? もしそうなら、それを取り除く方法は?#pragma GCC diagnostic error "-Wpointer-to-int-cast"
対応するプッシュとポップで使ってみまし たが効果なし。