Typedef更改行为导致错误和警告

时间:2013-07-12 11:55:57

标签: c++ c typedef declaration

以下是关于typedef修改的一些实验,我无法理解2和6行。为什么2和5会给出不同的结果? 请给我一些澄清。

typedef long _long;
extern _long tl;         //1 Fine...OK
extern _long int tli;    //2 extraneous `int' ignored...??
extern int _long til;    //3 `_long' does not name a type...OK
extern long l;           //4 Fine...OK
extern long int li;      //5 Fine...OK
extern int long il;      //6 Fine...??

2 个答案:

答案 0 :(得分:4)

typedef关键字为完整类型创建别名,而不是为其他关键字创建别名。

所以,例如。

extern _long int tli;

和你做的差不多

extern long int int tli;

答案 1 :(得分:4)

您试图以类似于宏的方式使用typedef,但这不是它们的工作方式。

当您typedef long _long时,表达式_long int未扩展为long int,它只会成为编译器错误,因为longint成为变量的两种类型。

您可以将cv-qualifications应用于此类型,例如:

extern const _long foo;

或者:

volatile _long bar;

如果你想要某些东西实际上是long int,你可以为它设置一个typedef:

typedef long int MyLongInt;

另外,请注意,不要使用前导下划线命名typedef。该标准保留了许多带有前导下划线的名称。有关详细信息,请参阅this