【发布时间】:2019-02-13 16:01:30
【问题描述】:
我正在将一些旧的 K&R 代码移植到 ANSI C,因此我正在编写缺少的函数原型声明。很多函数定义都带有寄存器存储类的参数,但不知道函数原型中是否可以省略寄存器存储类说明符?
无论有无寄存器存储类特定声明,代码都能正确编译(我尝试过 GCC、VC++ 和 Watcom C)。我在 ISO/ANSI C89 标准中找不到任何关于正确方法的信息 - 如果我只是将 register 关键字放在函数定义中可以吗?
int add(register int x, register int y);
int add(register int x, register int y)
{
return x+y;
}
这也正确构建:
int add(int x, int y);
int add(register int x, register int y)
{
return x+y;
}
我想确保根据标准确实考虑了寄存器存储说明符(我的目标是使用非常旧的编译器进行编译,其中这个存储类说明符很重要)。两者都可以吗,这只是编码风格的问题吗?
【问题讨论】:
-
目标编译器/系统是什么?
-
看看这里:port70.net/~nsz/c/c11/n1570.html#6.7.6.3 唯一应该出现在参数声明中的存储类说明符是寄存器。
-
存储类不是确定类型是否兼容的因素。因此,用 register 声明的函数的类型应该与没有 register 声明的函数的类型兼容,如果它们在其他方面兼容的话。
-
@EugeneSh。这不是个例。存储类从不包含在类型信息中。
auto int x;、static int x;和register int x;都具有int类型。 -
@PSkocik 为什么不能包含
auto而register可以(好吧,static没有意义)?
标签: c declaration definition c89