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

C++ Typedef更改行为导致错误和警告,c++,c,typedef,declaration,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;

下面是一些关于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
关键字为完整类型而不是其他关键字创建别名

例如

extern _long int tli;
和你做的差不多

extern long int int tli;

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

例如

extern _long int tli;
和你做的差不多

extern long int int tli;

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

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

您可以将简历资格应用于此类类型,例如:

extern const _long foo;
或:

如果您希望某个对象实际上是
长int
,可以为此设置typedef:

typedef long int MyLongInt;

另外,顺便说一句,不要在typedef的名字前面加下划线。该标准保留了许多带有前导下划线的名称。有关详细信息,请参阅。

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

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

您可以将简历资格应用于此类类型,例如:

extern const _long foo;
或:

如果您希望某个对象实际上是
长int
,可以为此设置typedef:

typedef long int MyLongInt;

另外,顺便说一句,不要在typedef的名字前面加下划线。该标准保留了许多带有前导下划线的名称。有关更多信息,请参阅。

首先,不要使用带前导下划线的全局名称,它们由规范保留。只需备注:
long x
长整数x
int长x都是等价的是,我在这里使用它只是为了便于阅读。首先,不要使用带前导下划线的全局名称,它们是规范保留的。只需一句话:
长x
长整数x
int长x都是等价的是的,我在这里使用它只是为了方便阅读。谢谢你的解释。顺便说一句,我用了_long来澄清,是的,应该避免。谢谢你的建议。:)谢谢你的解释。顺便说一句,我用了_long来澄清,是的,应该避免。谢谢你的建议。:)