ZBLOG

zpw@zpw-ThinkStation-P340:~/study/redis$ make for dir in src; do make -C $dir all; done make[1]: 进入目录“/home/zpw/study/redis/src” CC threads_mngr.o threads_mngr.c:27:37: warning: initializing '_Atomic(run_on_thread_cb)' with an expression of ty...

看起来你在编译 Redis 时遇到了一个与原子变量初始化相关的错误。这个错误通常是因为代码中使用了 ATOMIC_VAR_INIT 宏,而该宏在 C11 标准中已被弃用(deprecated),尤其是在较新的编译器版本(如 Clang 14)中可能不再支持。以下是解决步骤:


问题分析

错误信息:

error: initializer element is not a compile-time constant
static redisAtomic run_on_thread_cb g_callback = ATOMIC_VAR_INIT(NULL);

这是因为 ATOMIC_VAR_INIT 宏在新版 C 标准中已被移除,且原子变量应直接初始化(无需特殊宏)。


解决方案

  1. 修改 threads_mngr.c 文件
    打开 src/threads_mngr.c,找到第 27 行:

    static redisAtomic run_on_thread_cb g_callback = ATOMIC_VAR_INIT(NULL);
    

    将其改为:

    static redisAtomic run_on_thread_cb g_callback = NULL;
    

    因为原子变量可以直接用常量初始化(C11 标准允许)。

  2. 如果仍有问题,检查 redisAtomic 的定义
    确保 redisAtomic 是通过 _Atomic 关键字定义的(Redis 通常有自己的封装)。例如:

    typedef _Atomic(run_on_thread_cb) redisAtomic;
    

    如果是这样,直接赋值 NULL 是合法的。

  3. 如果其他文件有类似错误
    搜索整个代码库中所有使用 ATOMIC_VAR_INIT 的地方,并类似地修改:

    grep -r "ATOMIC_VAR_INIT" src/
    
  4. 临时禁用警告(可选)
    如果只是警告(warning)而不是错误,可以在编译时添加 -Wno-pedantic 忽略:

    make CFLAGS="-Wno-pedantic"
    

    但建议优先修复代码而非忽略警告。


验证修复

重新编译:

make clean && make

备注

  • 此问题常见于较新版本的 Clang/GCC 编译器,因为旧代码(如 Redis 的某些分支)可能未更新到最新 C 标准。
  • 如果 Redis 版本较老,建议升级到最新稳定版(如 Redis 7.2+),其中此类问题通常已修复。

如果仍有问题,请提供你的 Redis 版本和编译器版本(clang --version),我会进一步协助!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24135

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?