如何将寄存器存储 class 与 typedef 一起使用?

How to use register storage class with typedef?

我想这样做:

typedef register unsigned int _newint;

基本上,register unsigned int 的简明别名是 _newint

但是出现错误,“可能未指定多个存储 class”,下划线 register

我想知道我能不能做到;如果是那么怎么办?

看起来很奇怪,typedef 关键字实际上是一个存储 class 说明符(而且,正如错误消息所示,你不能有第二个,register同一语句中的说明符)。来自 this C11 Draft Standard:

6.7.1 Storage-class specifiers


5     The typedef specifier is called a ‘‘storage-class specifier’’ for syntactic convenience only; it is discussed in 6.7.8. The meanings of the various linkages and storage durations were discussed in 6.2.2 and 6.2.4.

如果尽管 above-quoted 段中的措辞如此,您还是觉得不方便,然后考虑为什么将存储 class 说明符添加到 typedef。如果在声明 实际变量 时添加 register 说明符(或任何其他限定符),很可能会使代码更清晰:

typedef unsigned int _newint;

void foo(void)
{
    register _newint MyNewInt;
    //...
}

'Hiding' 别名中的 register 说明符可能会给您代码的未来读者带来问题,他们将无法理解为什么要添加 不同的 该类型变量的说明符会导致问题。

I want to know if I can do this or not, if yes then how?

typedefregister 都算作存储 classes,尽管这在 typedef 的情况下有点技术性。你不能声明任何标识符有一个以上的存储 class,所以直接的答案是否定的,你不能那样做。

你可以想象使用宏而不是 typedef 来达到类似的效果:

#define _newint register unsigned int

void foo() {
    _newint x;
}

然而,这是误导,所以你不应该。

更一般地说,您可能根本不应该使用 register 存储 class。现代编译器不需要您的帮助来确定将哪些变量存储在寄存器中,并且 register 只是一个提示,因此唯一值得注意的效果是(根据规则)阻止您获取对象的地址使用该存储声明 class.