为什么typedef不能用于静态?

时间:2010-02-07 21:30:31

标签: c++

为什么typedef不能与static一起使用?例如,下面的代码是错误

typedef static int INT2;

使用typedef还应遵循哪些其他规则?还有哪些其他关键字不能与typedef一起使用?

非常感谢!

6 个答案:

答案 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;
  • 返回INT2的函数没有意义。当然返回值不是静态的(它不可以)。
  • MyClass中的x成员声明是静态的,还有后来的定义?这不仅是多余的,也是不正确的,因为在定义静态成员时不会使用static关键字 - 仅在声明它时。

同样适用于Bailey提到的其他关键词。想一想:唯一可以为其所有用途声明一致的类型的关键字是基本类型本身,以及类型修饰符(const,unsigned等)。

答案 4 :(得分:3)

正如许多其他人所提到的,static是存储类说明符,而不是类型。具体来说,这意味着static关键字告诉编译器应该放置变量的位置,是否应该作为外部链接的符号出现,或者变量应该保留多长时间

类型是对内存位置的解释。它描述了该位置中的数据类型,并与可以对该数据执行的一组操作相关联。

所以类型和存储类只是相关的,因为它们都说了一些数据。 typedef关键字用于为类型创建新名称。

至于随机类比......

类型就像谈论汽车的特定品牌和型号。

存储类就像是说汽车存放在私人加热车库中,只能在私人赛道上使用。

typedef是特定品牌和型号的昵称。

答案 5 :(得分:3)

typedef不能与static一起使用,因为typedefstatic都是存储类。如果将变量定义为typedef static int a;,则变量a存在多个存储类。

存储类用于定义变量和/或函数的范围(可见性)和生命周期。一些示例包括staticautoregisterexterntypedef等。