c—什么是register const char*const*name;为什么这个变量在函数之外?

gpnt7bae  于 2021-06-24  发布在  Storm
关注(0)|答案(2)|浏览(386)
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 ();
}

我不明白为什么寄存器变量不在花括号内,而fprintf前面的这个(void)是什么?还有register const charconstcpp,我以前从没见过这样的东西

xdnvmnnf

xdnvmnnf1#

您“以前从未见过”的原因是,它使用的是原始的、历史的k&rcc版本的语法。你看到的一定是一些真实的旧c代码。我刚查了一下,ansic(c90)是1990年推出的,所以这个代码至少有30年左右的历史了。
如果需要处理历史上的c代码,我想这是需要知道的,否则你可以简单地忘记它。
这个 (void) 演员的意思和今天一样。

llycmphe

llycmphe2#

这个 register 关键字是对编译器的一个提示,您希望该值保存在处理器上的专用寄存器中。这可以加快读写速度。然而,在现代编译器中,这种优化不仅没有必要,而且往往适得其反。
它位于函数声明和块之间的原因是,在旧c(c90以前)中,您不会在参数旁边声明参数类型,而是在函数声明和块之间声明参数类型。
例如:

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

注意我什么都没做 argc 因为如果不显式定义类型,它将默认为int。
你会比你想象的更经常看到这个。我在做ffmpeg的时候碰到过很多这样的人。
(void)cast防止未使用的参数警告/错误。我在使用低级回调函数处理portaudio时遇到过这种情况。

相关问题