c - 将container_of宏应用于嵌入的char数组时报告警告

标签 c gcc macros gcc-warning

当我将 container_of 宏应用于包含 char 数组的 C 结构时,我收到警告:从不兼容的指针类型初始化

代码如下:

#define container_of(ptr, type, member) ({          \
    const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
    (type *)( (char *)__mptr - offsetof(type,member) );})


struct st {
    int a;
    char b;
    char c[16];
    void *p;
};

int main(void)
{
    struct st t = {
        .a = 101,
        .b = 'B',
        .c = "hello",
        .p = NULL
    };

    char (*p)[16] = &t.c;
    struct st *s = container_of(p, struct st, c);

    return 0;
}

看来__mptr的类型是[],是由typeof()推导出来的。然而,ptr本身就是(*)[]类型。显然,它们不一样。

此外,如果我用clang编译这段代码,一切都正常。 GCC 似乎对类型检查有更严格的规则。

问:如何纠正此警告?

最佳答案

__mptr 的声明没有用,因为它只是在下一行中转换为 char*。只需将宏替换为:

#define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member)))

注意:GCC 6.2.0 没有对原始代码发出任何警告,除非未使用的变量 s

关于c - 将container_of宏应用于嵌入的char数组时报告警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39961293/

相关文章:

linux - 套接字 : bind address not supported by protocol

c++ - Easylogging++如何配置单个宏?

VBA Excel 2010 - 如何将宏分配给使用宏创建的命令按钮

java - C + JNI : CallStaticCharMethod causes error

c - 静态库实现与包含源代码实现

c可以声明两个具有相同名称,返回类型但参数不同的函数吗

clojure - 如何实现一个Lisp宏系统?

c - 在 Bison 中对 n < 0 使用 $n

c - 在 C 编程中寻找模数或 % 的直接相反数

c++ - 包含成员函数名称为errno和cerrno时的g++ 7编译错误