为什么typedef不能与static一起使用?

25

为什么typedef不能和static一起使用?例如,下面的代码就会出现错误

typedef static int INT2;

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

非常感谢!


9
typedef和static都是该语言中的存储类型(严格适用于C;我认为在C++中也是如此)。你只能在单个声明中使用一个存储类 - 在你的例子中使用了两个,因此出现了错误。 - Jonathan Leffler
3
typedef关键字被称为“存储类别说明符”,仅出于语法方便而如此命名; - dirkgently
6个回答

43

typedef并非声明变量的实例,而是声明类型(实际上是类型别名)。

static是应用于实例而非类型的限定符,因此您可以在使用该类型时使用static,但不能在定义类型时使用。像这样...

typedef int int32;
static int32 foo;

5
static 不是一个限定词,而是一种 存储类别说明符(storage class specifier)。因此,它不像 const 这样的限定词那样 "属于类型",例如 typedef const int ci; ci x = 42; (带有不同限定词的类型仍然是相同的类型,但可能不兼容)。 - dyp
优雅! 一个很棒的答案! - Sohaib

22
static关键字并非类型的一部分,它是存储或作用域说明符,具体取决于上下文,并且对类型没有任何影响。因此,它不能用作类型定义的一部分,这就是为什么在这里无效的原因。
typedef是类型定义,即你声明“这个名称”现在引用“这个类型”,给定的名称必须是语言标准所定义的标识符,类型必须是类型说明符,即已命名的类型,包括基本类型或typedef类型,结构体、联合体、类或枚举说明符,可能还带有类型限定符,例如const或volatile。
然而,static关键字并不改变类型,它说明了对象的某些特性(通常不涉及面向对象编程)。例如,它是放置在静态存储区中的变量,而不是类型。
看起来你试图将typedef用作宏,即:
#define MYINT static int

@Douglas Adams的粉丝:我认为它确实可以;也许没有Bailey的回答那样清晰。存储说明符和作用域说明符不是某物类型的一部分;它们是该类型的实例如何存储或作用域的组成部分。 - T.J. Crowder
@Robert 嗯,正如关键字所说,这是一个类型定义,由于 static 不是类型的一部分,因此不能在类型定义中使用。 - wich
@T.J. Crowder:原始答案并没有这么详细解释。 - dirkgently
@dirk 原始答案就是你在 T.J. 发表评论时看到的那样。 - wich

7

存储持续时间与对象相关。typedef声明创建一个别名--一种类型的新名称。它不会创建对象。因此,您不能在typedef中使用存储说明符。


5
typedef 不能与 static 同时使用,因为它们都是存储类。如果您将变量定义为 typedef static int a;,则该变量 a 存在多个存储类。
存储类用于定义变量和/或函数的作用域(可见性)和生存期。一些例子包括 staticautoregisterexterntypedef 等。

这很有趣!实际上,typedef 被指定为存储类说明符,尽管 "仅为语法方便" 6.7.1/3。 - dyp
Jonathan Leffler在对OP的评论中发表了与此相同的观点。 - dyp

3
我认为wich和Bailey的答案是正确并且足够了。但是为了帮助那些评论者更加清晰地理解:当你声明一个typedef时,所得到的类型必须在它可能被使用的任何地方保持一致。如果你所创建的typedef出现在以下代码中会怎样呢:
INT2 myfunction()
{
  return 0;
}

class MyClass
{
  public: INT2 x;
};

INT2 MyClass::x;
  • 返回 INT2 的函数毫无意义。当然,返回值不是静态的(它不能是静态的)。
  • MyClass 中的 x 成员声明将是静态的,而且后面的定义也是?这不仅是多余的,而且是错误的,因为在定义静态成员时不使用 static 关键字 - 只有在声明时才使用。

对于 Bailey 提到的其他关键字也是如此。想想看:可以一致地为所有用途声明类型的唯一关键字是基本类型本身和类型修饰符(const、unsigned 等)。


3
正如其他人所提到的,static是一个存储类别说明符,而不是类型。具体来说,static关键字告诉编译器有关变量应放置在何处、是否应出现为外部链接符号或变量应保留多长时间的信息。
类型是对内存位置的解释。它描述了该位置中生活的数据类型,并与一组可对该数据执行的操作相关联。
因此,类型和存储类别仅相关于它们都说出了有关数据的某些内容。而typedef关键字则用于创建类型的新名称。
至于一个随机的比喻……
类型就像谈论特定品牌和型号的汽车。
存储类别就像说汽车存储在私人加热车库中,只在私人赛道上使用。 typedef就是一个特定品牌和型号的昵称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接