这种多余的"typedef"严格合法吗?
Is this redundant "typedef" strictly legal?
>我在 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
任何地方都没有这样的规则.
- C++:TypeDef使用元组
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 为什么在使用typedef时类推导指南会失败
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何重新定义MPI_FLOAT,MPI_DOUBLE以 typedef 的方式
- typedef 枚举和枚举类有什么区别?
- 在类模板中使用 typedef 时出错
- 模板类中的 typedef 语句
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 为什么在C++使用常量函数时常量是多余的?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- 向前声明指向类的 typedef 指针
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 如何创建 typedef 结构的前向声明
- 从 Typedef 数据类型中删除常量
- typedef vector size_type in header file
- typedef 别名的析构函数
- 这种多余的"typedef"严格合法吗?