为什么typedef不能与static一起使用?例如,下面的代码是错误
typedef static int INT2;
使用typedef还应遵循哪些其他规则?还有哪些其他关键字不能与typedef一起使用?
非常感谢!
答案 0 :(得分:32)
typedef不声明变量的实例,它声明了一个类型(实际上是类型别名),
static
是您应用于实例而不是类型的限定符,因此您可以在使用类型时使用静态,但在定义类型时则不能。像这样......
typedef int int32;
static int32 foo;
答案 1 :(得分:20)
static
关键字不属于该类型,具体取决于它是存储或范围说明符的上下文,并且对该类型没有任何影响。因此,它不能用作类型定义的一部分,这就是为什么它在这里无效。
typedef是一个类型定义,即你说'this name'现在引用'this type',你给出的名称必须是语言标准定义的标识符,类型必须是类型说明符,即一个已经命名的类型,基本类型或typedef'd,结构,联合,类或枚举说明符,可能的类型限定符,即const或volatile。
然而,静态关键字不会改变类型,它会说明关于对象的内容(通常,不是在OOP意义上)。它是放在静态存储中的变量,而不是类型。
看起来你正在尝试使用typedef作为宏,即
#define MYINT static int
答案 2 :(得分:7)
存储持续时间与对象相关联。 typedef声明创建别名 - 类型的新名称。它不会创建对象。因此,您不能将存储说明符与typedef一起使用。
答案 3 :(得分:3)
我认为来自wich和Bailey的答案是正确和足够的,但是为了帮助澄清那些评论:当你声明一个typedef时,结果类型必须在任何地方都可以使用它。如果您创建的typedef出现在以下代码中,该怎么办:
INT2 myfunction()
{
return 0;
}
class MyClass
{
public: INT2 x;
};
INT2 MyClass::x;
同样适用于Bailey提到的其他关键词。想一想:唯一可以为其所有用途声明一致的类型的关键字是基本类型本身,以及类型修饰符(const,unsigned等)。
答案 4 :(得分:3)
正如许多其他人所提到的,static
是存储类说明符,而不是类型。具体来说,这意味着static
关键字告诉编译器应该放置变量的位置,是否应该作为外部链接的符号出现,或者变量应该保留多长时间
类型是对内存位置的解释。它描述了该位置中的数据类型,并与可以对该数据执行的一组操作相关联。
所以类型和存储类只是相关的,因为它们都说了一些数据。 typedef
关键字用于为类型创建新名称。
至于随机类比......
类型就像谈论汽车的特定品牌和型号。
存储类就像是说汽车存放在私人加热车库中,只能在私人赛道上使用。
typedef是特定品牌和型号的昵称。
答案 5 :(得分:3)
typedef
不能与static
一起使用,因为typedef
和static
都是存储类。如果将变量定义为typedef static int a;
,则变量a
存在多个存储类。
存储类用于定义变量和/或函数的范围(可见性)和生命周期。一些示例包括static
,auto
,register
,extern
,typedef
等。