为什么typedef不能和static一起使用?例如,下面的代码就会出现错误
typedef static int INT2;
在使用typedef时还应遵循哪些规则?有哪些关键字不能与typedef一起使用?
非常感谢!
为什么typedef不能和static一起使用?例如,下面的代码就会出现错误
typedef static int INT2;
在使用typedef时还应遵循哪些规则?有哪些关键字不能与typedef一起使用?
非常感谢!
typedef并非声明变量的实例,而是声明类型(实际上是类型别名)。
static
是应用于实例而非类型的限定符,因此您可以在使用该类型时使用static,但不能在定义类型时使用。像这样...
typedef int int32;
static int32 foo;
static
不是一个限定词,而是一种 存储类别说明符(storage class specifier)。因此,它不像 const
这样的限定词那样 "属于类型",例如 typedef const int ci; ci x = 42;
(带有不同限定词的类型仍然是相同的类型,但可能不兼容)。 - dypstatic
关键字并非类型的一部分,它是存储或作用域说明符,具体取决于上下文,并且对类型没有任何影响。因此,它不能用作类型定义的一部分,这就是为什么在这里无效的原因。#define MYINT static int
存储持续时间与对象相关。typedef声明创建一个别名--一种类型的新名称。它不会创建对象。因此,您不能在typedef中使用存储说明符。
typedef
不能与 static
同时使用,因为它们都是存储类。如果您将变量定义为 typedef static int a;
,则该变量 a
存在多个存储类。static
、auto
、register
、extern
、typedef
等。typedef
被指定为存储类说明符,尽管 "仅为语法方便" 6.7.1/3。 - dypINT2 myfunction()
{
return 0;
}
class MyClass
{
public: INT2 x;
};
INT2 MyClass::x;
对于 Bailey 提到的其他关键字也是如此。想想看:可以一致地为所有用途声明类型的唯一关键字是基本类型本身和类型修饰符(const、unsigned 等)。
static
是一个存储类别说明符,而不是类型。具体来说,static
关键字告诉编译器有关变量应放置在何处、是否应出现为外部链接符号或变量应保留多长时间的信息。typedef
关键字则用于创建类型的新名称。typedef
就是一个特定品牌和型号的昵称。