質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

1258閲覧

C 言語 enum について

kokok

総合スコア145

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

2クリップ

投稿2019/07/30 07:52

c

1 2 31 42 53 64 75 86 97 108 119 1210 1311 1412 1513 1614 1715 1816 1917 2018 2119 2220 2321 2422 2523 2624 2725 2826 2927 3028 31#include <stdio.h> 32 33// enum型の定義 34enum week { 35 Mon, 36 Tue, 37 Wed, 38 Thu, 39 Fri, 40 Sat, 41 Sun 42}; 43 44int main(void) { 45 // enum型の宣言 46 enum week wk0, wk1, wk2; 47 48 // enum型のメンバを代入 49 wk0 = Mon; 50 wk1 = Tue; 51 wk2 = Wed; 52 53 printf("Monの値は: %d\n", wk0); 54 printf("Tueの値は: %d\n", wk1); 55 printf("Wedの値は: %d\n", wk2); 56 57 return 0; 58}

0
1
2

と表示されますが

enum week の MonやTue などの値自体は 取り出せないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2019/07/30 08:03

値自体とは・・・?
guest

回答4

0

ベストアンサー

こんにちは。

デバッグ用に enum 型のシンボル名を表示したいことってよくありますよね。
決して判りやすくはないですが、マクロを駆使する方法があります。
下記のenum.incはシンボル対応enum型を定義する際に毎回 #includeします。(もしかすると#undefが漏れていて2回使い回すとエラーになる可能性がありますが、その時は#undefを適切に指定すれば良いです。)

C

1// enum.inc 2#define SYM(dSym) dSym, 3#define LAST_SYM(dSym) dSym 4enum NAME 5{ 6 SYM_LIST 7}; 8#undef SYM 9#undef LAST_SYM 10 11#define CAT_I(a,b) a##b 12#define CAT(a,b) CAT_I(a,b) 13static char const* CAT(get_, NAME)(enum NAME val) 14{ 15 #define SYM(dSym) case dSym: return #dSym; 16 #define LAST_SYM(dSym) case dSym: return #dSym; 17 switch(val) 18 { 19 SYM_LIST 20 } 21 #undef SYM 22 #undef LAST_SYM 23 24 return NULL; 25} 26#undef CAT 27#undef CAT_I 28#undef NAME 29#undef SYM_LIST

C

1// main.c 2#include <stdio.h> 3 4#define NAME week 5#define SYM_LIST \ 6 SYM(Mon) \ 7 SYM(Tue) \ 8 SYM(Wed) \ 9 SYM(Thu) \ 10 SYM(Fri) \ 11 SYM(Sat) \ 12 LAST_SYM(Sun) 13#include "enum.inc" 14 15int main() 16{ 17 enum week day=Wed; 18 printf("day=%s\n", get_week(day)); 19 return 0; 20}

wandbox

このテクニックは、C++コンパイラである clang の内部実装で頻繁に使われています。
マクロでのみ可能な記述です。意外に有用です。

投稿2019/07/30 15:03

編集2019/07/30 15:59
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2019/07/30 15:48

enum.incのコードの先頭が一部欠けているようです。 --- マクロを複数回定義し直す方法は目から鱗でした。
Chironian

2019/07/30 15:52

LouiS0616さん ぎゃっ、コピペミスしてました。ご指摘ありがとうございます!! 回答文を修正しました。
guest

0

enum week の MonやTue などの値自体

こういうことをやりたいんでしょうがC言語のenum型の変数は単なる数値なのでできません。
(Qiita)C++のenumの値を文字列にできるライブラリnameofがすごい
※C++でもこのURLの記事のように工夫が必要です

enum week { Mon, Tue, Wed, Thu, Fri, Sat, Sun };

は、以下の省略したものです。

enum week { Mon = 0, Tue = 1, Wed = 2, Thu = 3, Fri = 4, Sat = 5, Sun = 6 };

投稿2019/07/30 08:15

Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/07/30 10:21

C でもプリプロセッサの # 演算子を使えばできるようですよ。
LouiS0616

2019/07/30 10:30

確かにMonから"Mon"を持ってくるのは容易ですが、wek0から"Mon"を取り出すこともできましたっけ?
Y.H.

2019/07/30 10:37 編集

質問者さんの反応がないので実際のところはわかりませんが、質問の趣旨はLouiS0616さんが記載されている、変数wek0から"Mon"を取り出したい、と私も解釈しました。
Zuishin

2019/07/30 10:55

なるほど。変数からということならもう一工夫必要ですね。可変長引数マクロと、配列か switch でも使いましょうか。 wk0 = 0, wk1 = 1, wk2 = 2 と固定のように見えるので、目的によっては別のアプローチもできるかもしれませんが。
pepperleaf

2019/07/30 15:21 編集

C言語の場合、コンパイルした時点で、元の名前は保持してないと思いますが、、、。 既にある回答のいくつかは、別の方法で名前を保持しているだけじゃないかと思います。(期待する結果になるなら、それでも良い?)
Zuishin

2019/07/30 15:23

プリプロセスの時点では残っているので、そこでソースを書き換えると、コンパイル後も残ります。 可変長引数ではどうも難しいようですが、Chironian さんの方法だとうまくいきますね。
pepperleaf

2019/07/30 15:30

> プリプロセスの時点では残っている 確かに。でも裏技的な気がする。
guest

0

enumの名前の文字列は保持してないので取り出せません。
別に定義しておくしかないですね

投稿2019/07/30 08:04

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

// enum型のメンバを代入
wk0 = Mon; wk1 = Tue; wk2 = Wed;

取り出してませんか?

投稿2019/07/30 08:02

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/07/30 08:04

もしかして名前の文字列ということですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問