enum (列挙子) を使う


さて、struct の話は一応おわって、すこしちがうものも簡単に教えておきます。 一つは、列挙子というやつです。良くある用途として、各種整数に名前を割り振りたいときに つかいます。
    enum tagSData { tagInt, tagDouble, tagSymbol, tagComposite};
これで、tagInt, tagDouble, tagSymbol, tagCompositeに別々の整数値(0,1,2,3)が 割り振ることができます。利用する側は、
typedef enum tagSData { tagInt, tagDouble, tagSymbol, tagComposite } tagSData_t;
/* これも型名をつけておきましょう。実体は整数だけど */
/* tagSData という identifier は使わない場合省略可能。 */

void foo(tagSData_t pp) {
    switch(pp) {
    case tagInt:
	/* Int の時の仕事 */
        break;
    case tagDouble:
	/* Double の時の仕事 */
        break;
    case tagSymbol:
	/* Symbol の時の仕事 */
        break;
    case tagComposite:
	/* Composite の時の仕事 */
        break;
    default:
	exit(1);
    }
}
これで、プログラムがなにをやっているかが分かりやすいでしょう。 数字だったらどこかで書き間違えたらそれで終りだし。

定数に名前をつける方法には、#define var 3 とかする方法もあります。 このあたりは、好みの問題でしょうね。

あと、ちょっとしたテクニックを紹介しておくと、tag の総数を求めるために、

typedef enum tagSData { tagInt, tagDouble, tagSymbol, tagComposite, tagSDataMax } tagSData_t;
と書いておくと、tagSDataMax が(これ以外の) tag の総数(=4)を示してくれます。

2001.11.20/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp