代码之家  ›  专栏  ›  技术社区  ›  Oliver Charlesworth

C语言中的兼容类型与结构

  •  19
  • Oliver Charlesworth  · 技术社区  · 14 年前

    int main(void)
    {
        struct { int x; } a, b;
        struct { int x; } c;
        struct { int x; } *p;
    
        b = a;   /* OK */
        c = a;   /* Doesn't work */
        p = &a;  /* Doesn't work */
    
        return 0;
    }
    

    未能按照GCC(3.4.6)进行编译,错误如下:

    test.c:8: error: incompatible types in assignment
    test.c:9: warning: assignment from incompatible pointer type
    

    现在,从我的理解(当然是从C99标准),是吗 a c 应该是兼容类型,因为它们满足第6.2.7节第1段中的所有标准。我已经尝试使用 std=c99

    想必我对标准的解释是错的吧?

    顺便提一下,出现这个问题是因为我想声明一些类似模板的宏来包装各种数据类型,而不必到处声明命名类型/typedef,例如,一个简单的示例:

    #define LINKED_LIST(T)   \
        struct {             \
            T    *pHead;     \
            T    *pTail;     \
        }
    
    ...
    
    LINKED_LIST(foo) list1;
    LINKED_LIST(foo) list2;
    
    ...
    
    LINKED_LIST(foo) *pList = &list1;  /* Doesn't work */
    
    5 回复  |  直到 13 年前
        1
  •  8
  •   torak    14 年前

    draft specification 我猜你是在依赖声明之后的条件:

    此外,如果两个结构、联合或枚举类型的标记和成员满足以下要求,则在单独的翻译单元中声明的两个结构、联合或枚举类型是兼容的。。。

    我认为,事实上,这些都是在同一个C文件中衰减意味着他们在一个单一的翻译单位。

        2
  •  10
  •   Giovanni Funchal    14 年前

    struct { int x; } typedef .

    struct tmp { int x; }; // declare structure tag
    typedef struct tmp type1;
    typedef struct tmp type2; // declare 3 types compatible with struct tmp
    typedef struct tmp type3; // and with each other
    
    type1 a, b;
    type2 c;
    type3 *p;
    b = a;
    c = a;
    p = &a;
    
        3
  •  3
  •   Dirk richarbernal    11 年前

    Compatibility of structures, unions, and enumerations

    在单个源文件中,每个结构或联合定义 创建一个既不与任何类型相同也不兼容的新类型 其他结构或联合类型。但是,类型说明符 对先前定义的结构或联合类型的引用是相同的 类型。标记将引用与定义相关联,并且 有效地充当类型名。为了说明这一点,只有 在本例中,结构j和k的数量是相容的:

    struct   { int a; int b; } h;
    struct   { int a; int b; } i;
    struct S { int a; int b; } j;
    struct S k;
    

    可相互分配兼容结构。

        4
  •  1
  •   Cromulent    14 年前

    有趣的是,Clang给出了以下信息:

    error: incompatible type assigning 'struct <anonymous>', expected 'struct <anonymous>'
    
    warning: incompatible pointer types assigning 'struct <anonymous> *', expected 'struct <anonymous> *'
    

    似乎如果声明了两个(或更多)匿名结构,那么编译器会执行一些内部魔法,指定引用哪个特定的匿名结构。

        5
  •  -1
  •   kriss    14 年前

    考虑到第6.2.7款(兼容类型)和第6.5.16.1款(分配规则),我的理解与您相同。

    在您的代码中,GCC的行为好像您的结构定义使用不同的标记(事实并非如此)。在这种情况下,类型将不兼容的。不过,它看起来仍然像一个gcc错误。

    其他实现C99标准的编译器有什么反馈吗?