这种多余的"typedef"严格合法吗?

Is this redundant "typedef" strictly legal?

本文关键字:typedef 多余      更新时间:2023-10-16

>我在 ACE Radius 库的 v0.9.2 中找到了以下声明:

// Types of attribute data
typedef enum AttributeFormat_e
{
    E_ATTR_FORMAT_INTEGER,
    E_ATTR_FORMAT_IP_ADDRESS,
    E_ATTR_FORMAT_STRING,
    E_ATTR_FORMAT_VENDOR_SPECIFIC,
    E_ATTR_FORMAT_USER_PASSWORD,
    E_ATTR_FORMAT_CHAP_PASSWORD
};

这种领导typedef是完全没有意义的,不应该存在。
实际上,GCC 发出以下诊断:

/

usr/include/ace-radius/RadiusAttribute.h:597:警告:此声明中忽略了"typedef"

现在,这最终是无害的,尽管在文件中是一种奇怪的半有意义的半C声明,否则只能解析为C++(声明在class中找到为private成员)。

但纯粹出于好奇,我想知道这是严格合规的,还是严格格式错误的,并且无法完全区分标准。

这领先的typedef合法吗?还是海湾合作委员会是宽容的?

这是合法的,原因很简单,标准中任何地方都没有反对它的规则。typedef 的效果仅定义为它对使用 typedef 说明符定义的名称的影响,因此当没有使用该说明符定义的名称时,行为是明确定义的:typedef根本没有影响。

语法通常不需要任何声明符即可进行简单声明,您可能已经知道这一点,因为如果没有typedef,您不会惊讶地看到enum AttributeFormat_e { ... };。作品是

简单声明
    decl-specifier-seq opt init-declarator-listopt ;
    attribute-specifier-seqdecl-specifier-seqoptinit-declarator-list ;

只要简单声明中不存在属性说明符 seq,初始化声明符列表就是可选的。

typedef int;是无效的,就像没有typedef int;一样,但这是一个不同的规则:那里的规则是声明必须声明某事。该规则不适用于您的问题中的内容,因为该声明确实声明了某些内容。更准确地说,C++11 [dcl.dcl]p3:

在简单声明中,只有在声明类(子句 9)或枚举 (7.2) 时,即当 decl-specifier-seq 包含类说明符、带有类键 (9.1) 的详细说明类型说明符或枚举说明符时,才能省略可选的 init-declarator-list。[...]

问题中的代码声明枚举,因此不违反此规则。

static enum E { x };是无效的,但这是另一个不同的规则:C++11 [dcl.stc]p1:

[...]如果存储类说明符出现在 decl-specifier-seq 中,则同一 decl-specifier-seq 中不能有typedef说明符,并且声明的 init-declarator-list 不应为空(在命名命名空间或全局命名空间中声明的匿名联合除外,应声明为 static (9.5))。[...]

const enum E { x };也是无效的,但这是第三个不同的规则:C++11 [dcl.type.cv]p1:

[...]如果 cv 限定符出现在 decl-specifier-seq 中,则声明的 init-declarator-list 不应为空。[...]

typedef任何地方都没有这样的规则.