这种多余的“typedef”是否严格合法?

时间:2015-01-16 11:34:23

标签: c++ c++11 language-lawyer c++14 c++03

我在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完全没有意义,不应该存在。
实际上,海湾合作委员会会发出以下诊断:

  

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

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

但纯粹出于好奇,我想知道这是严格遵守,还是严格错误,并且无法从标准中说出来。

这是领先的class合法吗?或者GCC是宽容的吗?

1 个答案:

答案 0 :(得分:11)

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

语法通常不需要任何简单声明的声明符,你可能已经知道这一点,因为如果没有{typedef你就不会感到惊讶1}}。制作是

  

简单声明
   decl-specifier-seq opt init-declarator-list opt enum AttributeFormat_e { ... };
   attribute-specifier-seq decl-specifier-seq opt init-declarator-list typedef < / p>

只要 simple-declaration 中没有 attribute-specifier-seq init-declarator-list 就是可选的。

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

  

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

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

int;无效,但这是另一条不同的规则:C ++ 11 [dcl.stc] p1:

  

[...]如果存储类说明符出现在 decl-specifier-seq 中,则说明中没有typedef说明符相同的 decl-specifier-seq 和声明的 init-declarator-list 不应为空(除了在命名空间或全局命名空间中声明的匿名联合之外) ,应声明static enum E { x };(9.5))。 [...]

typedef也无效,但这是第三条不同的规则:C ++ 11 [dcl.type.cv] p1:

  

[...]如果 cv-qualifier 出现在 decl-specifier-seq 中,则 init-declarator-list 为声明不得为空。 [...]

static无处可去。

相关问题