C标准是否认为有一个或两个?结构超级用户输入';此标题中的类型?

C标准是否认为有一个或两个?结构超级用户输入';此标题中的类型?,c,c99,C,C99,您能给出三个C标准(最好是C99或C11)中的一个标准的章节和诗句吗?这表明下面的头文件中是否有一个或两个struct-uperms\u条目类型 #ifndef UPERMS_CACHE_INCLUDE #define UPERMS_CACHE_INCLUDE typedef struct mutex MT_MUTEX; typedef struct uperms_cache { MT_MUTEX *cache_lock; int

您能给出三个C标准(最好是C99或C11)中的一个标准的章节和诗句吗?这表明下面的头文件中是否有一个或两个
struct-uperms\u条目
类型

#ifndef UPERMS_CACHE_INCLUDE
#define UPERMS_CACHE_INCLUDE

typedef struct mutex MT_MUTEX;

typedef struct uperms_cache
{
    MT_MUTEX            *cache_lock;
    int                  processing;
    struct uperms_entry *uperms_list;  // No prior struct uperms_entry
} uperms_cache_t;

typedef struct uperms_entry // Does this define a different struct uperms_entry?
{
    char                 username[32];
    int                  perms;
    struct uperms_entry *next;
} uperms_entry_t;

#endif /* UPERMS_CACHE_INCLUDE */
附加问题:

  • 如果有两种类型,有没有办法让GCC报告问题
  • 如果有两种类型,那么它在实践中是否重要
  • (我认为答案是‘是——严格来说有两种’,然后是(1)否和(2)否。)

    背景:内部代码审查——我希望结构的顺序颠倒过来,但我不确定我是否完全过于迂腐

    更新:

    显然,最初问题的答案是“有一个
    struct uperms\u条目
    ”,因此编号为1和2的问题没有实际意义。我很高兴在代码评审中发出嘶嘶声之前检查过

    背景思维 本节是在主要问题解决很久之后添加的


    以下是ISO/IEC 9899:2011中一些广泛但相关的引用:

    §6.2.7兼容型和复合型 ^1如果两种类型的类型相同,则它们具有兼容的类型。 确定两种类型是否兼容的其他规则包括 6.7.2中描述了类型说明符,6.7.3中描述了类型限定符, 在6.7.6中,对于声明者。55)此外,两种结构, 在单独的转换单元中声明的联合或枚举类型是 如果其标签和成员满足以下要求,则兼容: 如果一个用标签声明,另一个用标签声明 标签。如果两者都在各自翻译范围内的任何地方完成 单位,则以下附加要求适用:应 成员之间的一对一的通信,每对 使用兼容类型声明相应的成员;如果有一个成员 一个是使用对齐说明符声明的,另一个是 使用等效对齐说明符声明;如果 该对使用名称声明,另一对使用相同的名称声明 名称对于两个结构,应在 同样的顺序。对于两个结构或并集,对应的位字段 应具有相同的宽度。对于两个枚举,对应的成员 应具有相同的值

    55)两种类型不必完全相同即可兼容

    §6.7.2.1结构和联合规范 ^8结构声明列表在 结构或联合说明符在翻译中声明新类型 单位。结构声明列表是 组织或工会的成员。如果结构声明列表 不包含任何直接或通过匿名方式命名的成员 结构或匿名联合,行为未定义。类型是 直到紧接着终止列表的
    }
    之后才完成,并且 此后完成

    §6.7.2.3标签 ^4结构、联合或枚举类型的所有声明 相同的作用域和使用相同的标记声明相同的类型。无关的 是否存在标记或该类型的其他声明 相同的翻译单位,类型不完整(129)直到 在定义内容的列表的右大括号之后, 然后完成

    ^5结构、联合或枚举类型的两个声明 在不同的范围内或使用不同的标记声明不同的类型。每个 结构、联合或枚举类型的声明 include标记声明不同的类型

    ^6表单的类型说明符

    struct-or-union identifier ;
    
    struct-or-union identifier
    
    struct-or-union identifier
    
    struct或union标识符
    opt
    {struct声明列表}

    enum identifier
    
    enum标识符
    opt
    {enumerator list}

    enum identifier
    
    enum标识符
    opt
    {enumerator list,}

    声明结构、联合或枚举类型。该列表定义了 结构内容、联合内容或枚举内容。如果 提供了标识符,130)类型说明符还声明 要作为该类型的标记的标识符

    ^7表格的声明

    struct-or-union identifier ;
    
    struct-or-union identifier
    
    struct-or-union identifier
    
    指定结构或联合类型,并将标识符声明为 该类型的标记。131)

    ^8如果表单的类型说明符

    struct-or-union identifier ;
    
    struct-or-union identifier
    
    struct-or-union identifier
    
    除作为上述其中一种形式的一部分之外发生,并且没有其他形式 将标识符声明为标记是可见的,然后声明 结构或联合类型不完整,并将标识符声明为 该类型的标记。131)

    ^9如果表单的类型说明符

    struct-or-union identifier ;
    
    struct-or-union identifier
    
    struct-or-union identifier
    

    enum identifier
    
    不是作为上述其中一种形式的一部分发生,以及声明 如果标识符的类型作为标记可见,则它将指定相同的类型 作为另一个声明,并且不重新声明标记

    ^12示例2说明如何使用标记的先前声明 指定一对相互引用的结构,声明

    struct s1 { struct s2 *s2p; /* ... */ }; // D1
    struct s2 { struct s1 *s1p; /* ... */ }; // D2
    
    指定一对包含指向彼此的指针的结构。 但是,请注意,如果s2已经声明为 在封闭作用域时,声明D1将引用它,而不是标记 s2在D2中声明。为了消除这种上下文敏感性 声明

    struct s2;
    
    可在D1之前插入。这在内部声明了一个新的标记s2 范围然后,声明D2完成了新类型的规范

    129)不完整类型只能在以下情况下使用: 不需要该类型的对象。例如,它是不需要的, 当typedef名称被声明为结构的说明符或 联合,或当指向或返回结构o的函数的指针