以下是关于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...??
答案 0 :(得分:4)
typedef
关键字为完整类型创建别名,而不是为其他关键字创建别名。
所以,例如。
extern _long int tli;
和你做的差不多
extern long int int tli;
答案 1 :(得分:4)
您试图以类似于宏的方式使用typedef
,但这不是它们的工作方式。
当您typedef long _long
时,表达式_long int
未扩展为long int
,它只会成为编译器错误,因为long
和int
成为变量的两种类型。
您可以将cv-qualifications应用于此类型,例如:
extern const _long foo;
或者:
volatile _long bar;
如果你想要某些东西实际上是long int
,你可以为它设置一个typedef:
typedef long int MyLongInt;
另外,请注意,不要使用前导下划线命名typedef。该标准保留了许多带有前导下划线的名称。有关详细信息,请参阅this。