我在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是宽容的吗?
答案 0 :(得分:11)
这是合法的,原因很简单,标准中的任何地方都没有针对它的规则。 typedef
的效果仅定义为它对使用typedef
说明符定义的名称有什么影响,因此当没有使用该说明符定义名称时,行为是明确定义的:{{1}根本没有效果。
语法通常不需要任何简单声明的声明符,你可能已经知道这一点,因为如果没有{typedef
你就不会感到惊讶1}}。制作是
简单声明:
decl-specifier-seq opt init-declarator-list optenum AttributeFormat_e { ... };
attribute-specifier-seq decl-specifier-seq opt init-declarator-listtypedef
< / 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
无处可去。