1

以下是对 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...??
4

2 回答 2

4

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

所以例如

extern _long int tli;

和你做的差不多

extern long int int tli;
于 2013-07-12T12:00:27.820 回答
4

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

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

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

extern const _long foo;

或者:

volatile _long bar;

如果您希望某些东西实际上是 a long int,您可以为此设置一个 typedef:

typedef long int MyLongInt;

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

于 2013-07-12T12:02:44.917 回答