Loose-Info.com

Last Update 2019/07/05


TOP - 各種テスト - C言語 - enum

enum(列挙型)に関するテストコード

実行環境
GCC-8.2.0
GNU C Library 2.28


その1

列挙定数の識別子重複エラーに関するテスト

main.c
#include <stdio.h> int main(void) { enum enTest1 {Test0, Test1, Test2}; enum enTest2 {Test2, Test3, Test4}; int Test4 = 10; printf("Test1 = %d : Test4 = %d\n", Test1, Test4); return 0; }

コンパイル実行結果
gcc -Wall -std=c11 -c main.c main.c: In function ‘main’: main.c:7:19: error: redeclaration of enumerator ‘Test2’ 列挙子 'Test2' の再宣言 enum enTest2 {Test2, Test3, Test4}; ^~~~~ main.c:5:33: note: previous definition of ‘Test2’ was here 前出の 'Test2'の定義はこちら enum enTest1 {Test0, Test1, Test2}; ^~~~~ main.c:9:9: error: ‘Test4’ redeclared as different kind of symbol 'Test4' が異なる種類のシンボルとして再宣言されました int Test4 = 10; ^~~~~ main.c:7:33: note: previous definition of ‘Test4’ was here 前出の 'Test4'の定義はこちら enum enTest2 {Test2, Test3, Test4}; ^~~~~

その2

enum型変数の使用

main.c
#include <stdio.h> /* 初期化指定値無しの列挙型 * * 初期値=0、以降の定数は前値+1 */ enum enumTestA {TestA0, TestA1, TestA2}; /* 初期化指定値有りの列挙型 * * 定数=指定値、指定値無しの定数は前値+1 */ enum enumTestB {TestB0 = 2, TestB1 = 4, TestB2}; /* 列挙型を引数と戻り値に使用する関数 */ enum enumTestB testFunc(enum enumTestA testA) { enum enumTestB retVal; switch (testA) { case TestA1: retVal = TestB1; break; case TestA2: retVal = TestB2; break; default: retVal = TestB0; break; } return retVal; } int main(void) { enum enumTestA eta = TestA1; enum enumTestB etb1 = TestB1; enum enumTestB etb2 = TestB2; printf("eta = %d\n", eta); printf("etb1 = %d\n", etb1); printf("etb2 = %d\n", etb2); printf("testFunc = %d\n", testFunc(eta)); return 0; }

実行結果
eta = 1 etb1 = 4 etb2 = 5 testFunc = 4

その3

#defineで定義されたマクロ名とenumの定数名が重複する場合のコンパイル結果

main.c
#include <stdio.h> #define TESTA1 123 /* #defineと識別子が重複する列挙型の定義 */ enum { TESTA0, TESTA1, TESTA2 }; int main(void) { printf("enum TESTA1 = %d\n", TESTA1); return 0; }

コンパイル実行結果
gcc -Wall -std=c11 -c main.c main.c:3:16: error: expected identifier before numeric constant #define TESTA1 123 ^~~ main.c:8:10: note: in expansion of macro ‘TESTA1’ マクロ 'TESTA1' がここで展開 TESTA0, TESTA1, TESTA2 ^~~~~~

その4

#defineによるマクロと同様にenumを使用

main.c
#include <stdio.h> /* 無名の列挙型として各定数を定義 */ enum { Ntv = 4, Ex = 5, Tbs = 6, Tx = 7, Cx = 8 }; int main(void) { printf("フジテレビは、%dチャンネル\n", Cx); return 0; }

実行結果
フジテレビは、8チャンネル