我正在阅读此处发布的 K&R 第 7 章中问题的解决方案。基本上,程序会根据程序的名称(“upper”或“lower”)将标准输入转换为小写或大写。它似乎将转换函数的名称存储在某种字典中,如下所示:
int (*convcase[2])(int) = {toupper, tolower};
然后根据程序的名称是以 au 还是 l 开头来访问这些函数:
if(argc > 0)
{
if(toupper((unsigned char)argv[0][0]) == 'U')
{
func = 0;
}
else
{
func = 1;
}
while((ch = getchar()) != EOF)
{
ch = (*convcase[func])((unsigned char)ch);
putchar(ch);
}
}
我理解那个代码块在做什么,但我从来没有见过像 convcase 的初始声明这样的东西。看起来像是宏、枚举和数组的某种奇怪组合。谁能解释(1)为什么 convcase 是一个指针;(2) 名称后面的 (int) 类型是什么;(3) toupper 和 tolower 在该声明中到底是什么,因为它们不是 char *s;(4) 何时/为何使用这种设置。当您有多个可能的函数调用时,它只是一个类似宏的快速工具来节省一些空间吗?