ここに投稿された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 * ではないため、その宣言内にあるものは正確には何ですか? (4) いつ/なぜこの種のセットアップを使用するか。複数の関数呼び出しが可能な場合に、スペースを節約するための簡単なマクロのようなツールですか?