Last Update 2013/02/13
enum(列挙型)に関するテストコード
テスト概要
列挙定数の識別子重複エラーに関するテスト
enum型変数の使用
初期化指定値無しの列挙型
初期化指定値有りの列挙型
列挙型を引数と戻り値に使用する関数
初期化指定値有りの列挙型
列挙型を引数と戻り値に使用する関数
#defineで定義されたマクロ名とenumの定数名が重複する場合のコンパイル結果
#defineによるマクロと同様にenumを使用(無名の列挙型として各定数を定義)
実行環境
GCC-8.2.0
GNU C Library 2.28
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チャンネル