什么注册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 时遇到了这个问题。
THE END
二维码