2
0
テーマ、知りたいこと
C言語の関数マクロの作法に関する質問になります。
以下のように、引数にEnumの型を指定させる関数マクロを考えています。
C言語
1#define SET_ENUM_FROM_NUM(in_integer, out_enum, enum_type) out_enum = (enum_type)in_integer;
こういった実装は、皆さんから見て一般的にあるものでしょうか?
また、危険性や、可読性などの観点からご意見を頂きたいです。
背景、状況
上記の例だと利点が分かりづらいのですが、実際にやりたいことは、「文字列とEnum の相互変換」 になります。
以下のような enum型と文字列の対応がありまして、
C言語
1typedef enum { 2 CMD_TYPE_A_1 = 0, 3 CMD_TYPE_A_2 , 4 CMD_TYPE_A_3 , 5} cmd_type_a_t; 6 7static const char* cmd_type_a_table = 8{ 9 "cmd_type_a_1", 10 "cmd_type_a_2", 11 "cmd_type_a_3", 12} 13 14//※ CMD_TYPE_BやCMD_TYPE_Cもある
これを相互変換する関数マクロを、以下のように一般化したいのです。
C言語
1#define CONVERT_STR_TO_ENUM(str, str_len, convert_table, out_enum, enum_type) \ 2{ 3 // covnert_tableを探索するループ 4 char idx = 0; 5 for(idx = 0 ; convert_tableの長さ ; idx++) 6 { 7 // convert_table[idx]とstrをmemcmpして、一致するものがあれば、 8 // 右のようにキャストする out_enum = (enum_type)idx; 9 // その後 break; 10 } 11} 12 13void main(){ 14 cmd_type_a_t cmd_type_a; 15 CONVERT_STR_TO_ENUM( "cmd_type_a_2", 12, cmd_type_a_table, cmd_type_a, cmd_type_a_t); 16 // cmd_type_a == CMD_TYPE_A_2 17}
配列のインデックスをEnumにキャストする際にどうしてもキャスト演算が必要になるのですが、一連の処理を一般化するために関数マクロの引数に型を入れたいというわけです。
冒頭の、型を関数マクロの引数にすることの是非や、そもそもこういった変換をするにはもっと良い方法があればご教示いただけますと幸いです。
回答8件