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

Typedef changing behaviour causing error and warning

本文关键字:错误 警告 改变 Typedef      更新时间:2023-10-16

下面是一些关于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...??

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

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

你可以将简历资格申请到这样一种类型,例如:

extern const _long foo;

或者:

volatile _long bar;

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

typedef long int MyLongInt;

此外,顺便说一句,不要用前导下划线来命名typedef。本标准保留了许多带有前导下划线的名称。有关详细信息,请参阅此。

typedef关键字为完整类型创建别名,而不是为另一个关键字创建别名。

因此,例如

extern _long int tli;

和你做差不多

extern long int int tli;