【发布时间】:2012-03-02 10:28:12
【问题描述】:
我的问题很简单。 在 C++ 中,在如下声明中推迟 typedef 是否合法? gcc 可以毫无问题地接受代码,但这是不推荐使用的方式吗?我问这个是因为我发现每次在指令开头都带有 typedef 的样本。
enum _mytype {
A=1,
B=2
} typedef mytype;
【问题讨论】:
-
这是合法的 C++ 语法(根据语法,
typedef是decl'ion-seq -> decl'ion -> block-decl'ion -> simple-decl'ion -> decl-spec-seq -> decl-spec),但我不确定语义是否明确。 -
您意识到这种 typedef 约定在 C++ 中已经过时了吧?不再有做 typedef st_foo {...} foo; 之类的诱惑。在 C++ 中,因为它不是简写任何东西:无论哪种方式,我们都可以在没有 'struct foo' 的情况下编写 'foo'。同样不需要像 typedef en_foo {...} foo; 这样的东西。出于同样的原因。实际上,根据 BUFB aka Expert C Programming,甚至不推荐使用 typedef 隐藏“struct”或“enum”的 C 约定。
-
并且使用以下划线开头的标识符并不是一个好主意。
-
在 C 中,
typedef被视为存储类说明符(仅为了语法方便起见),并且将存储类说明符放置在声明开头以外的位置已过时。我认为 C++ 标准中没有类似的说法。 -
这是最令人困惑的语法。您正在节省一行。加上你的变量名很臭(_mytype vs mytype)。为什么不只是省去麻烦,给枚举一个正确的名称,例如
ABList,然后你就不需要typedef了。我唯一会使用 typedef 的类型是编译器不支持的类型,或者说一个向量声明,例如:typedef vector<Polygon> PolygonColl所以我不必在方法参数中使用vector<Polygon>,我可以只使用PolygonColl thePolygons.