gpt4 book ai didi

c - 这个 "makes integer from pointer without a cast"在定义中安全吗?

转载 作者:太空宇宙 更新时间:2023-11-04 07:25:26 26 4
gpt4 key购买 nike

我使用以下函数为用户自动通知:

#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 在编译期间显示警告:

warning: (near initialization for ‘(anonymous)[1]’)
warning: initialization makes integer from pointer without a cast [enabled by default]
warning: (near initialization for ‘(anonymous)[2]’)
warning: initialization makes integer from pointer without a cast [enabled by default]
warning: (near initialization for ‘(anonymous)[3]’)
warning: initialization makes integer from pointer without a cast [enabled by default]

代码运行完美,但这真的安全吗?如果是,如何摆脱它?我尝试将 #pragma GCC diagnostic error "-Wpointer-to-int-cast" 与相应的推送和弹出一起使用,但没有任何效果。

最佳答案

代码有效:

  • 使用指针类型首次初始化 uint32_t 永远不会溢出该值。会有信息丢失,但什么都没有更多。
  • 那你也只用sizeof这样的野兽,所以复合永远不会评估文字。

从错误的角度来看,无论如何,你的参数对 0 参数不起作用,所以最好删除 gccish , ## 技巧和游戏 +-1

正如其他人所说,向您的代码用户强加一堆警告确实是一种糟糕的风格。这种东西绝对不能过审。

最后,有些宏仅使用标​​准 C (C99) 来实现相同的目标,例如来自 P99P99_NARG .

关于c - 这个 "makes integer from pointer without a cast"在定义中安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18823233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com