什么注册constchar*const*name;意思是为什么这个变量在函数之外?

void
usage (cpp)
    register const char *const *cpp;
{
    (void) fprintf (stderr, *cpp++, program_name, cvs_cmd_name);
    for (; *cpp; cpp++)
    (void) fprintf (stderr, *cpp);
    error_exit ();
}

我不明白为什么 register 变量不在大括号内,fprintf 前面的这个 (void) 是什么?还要注册 const char *const *cpp,我以前从未见过这样的事情

回答

您“以前从未见过”的原因是因为这是使用原始的、历史的、K&R C 版本的语法。那一定是您正在查看的一些真实的旧 C 代码。刚刚查了一下,ANSI C(C90)是1990年出来的,所以这段代码肯定至少有30年左右的历史了。

如果需要处理历史悠久的 C 代码,我想这是需要知道的,否则你可以简单地忘记它。

(void)投意味着它今天意味着同样的事情。

  • While the arg syntax is K&R, K&R didn't have `void` or `const`.

回答

register关键字提示编译器您希望将该值保存在处理器上的专用寄存器中。这可以加快读取和写入速度。然而,对于现代编译器,这种优化不仅是不必要的,而且往往适得其反。

它位于函数声明和块之间的原因是,在旧 c(C90 之前)中,您不会在参数旁边声明参数类型,而是在函数声明和块之间声明参数类型。

例如:

int main(argc, argv)
char ** argv;
{
 ...
}

注意我没有做任何事情,argc因为如果你没有明确定义一个类型,它默认为 int。

你会比你想象的更频繁地看到这一点。当我在 FFMPEG 上工作时,我遇到了很多。

(void) cast 防止未使用的参数警告/错误。我在使用低级回调函数处理 PortAudio 时遇到了这个问题。


以上是什么注册constchar*const*name;意思是为什么这个变量在函数之外?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>