前提・実現したいこと
enum class
を用いたソースのC言語とC++の相互利用について考えています。
しかしenum class
はC言語で使えない上、using
も使えないのでtypedef
などに置き換えるためにマクロでスイッチすればいいと思いますが
基底型を用いた記述はコンパイルが通りません。
C言語のenumの許される仕様について調べたのですがC++ばかりひっかかりうまく調べられず質問しました。
質問
VisualStudio2022(コンパイラはLegacy/C11/C17で確認済み)で実行したところ基底型についてエラーを吐きました。
またgccを用いてコンパイルしたところ基底型以前にuse of enum ‘_enum_sample_32’ without previous declaration
と前方宣言の時点でエラーを吐きました。
環境の違いは置いておいたとして
C言語としてのenum
はC++と違い"前方宣言"も"基底型"も許さないのでしょうか
それとも以下のコードは私の記述が間違っているのでしょうか。
またenum
とenum class
を両立させるためにはどういうテクニックがありますか?
基底をint64_t
のような64bitにしたいので困っています。
ソースコード
"source.cpp"だとVisualStudioはC++で捌かれるので試される場合は"source.c"と拡張子を".c"にする必要があります。
#include <stdio.h> #include <stdint.h> #ifdef __cplusplus #include <cstdio> #include <cstdint> #endif enum _enum_sample_32; typedef enum _enum_sample_32 enum_sample_32; enum _enum_sample_64 : int64_t; typedef enum _enum_sample_64 enum_sample_64; #ifdef __cplusplus enum class _enum_class_sample_32; typedef _enum_class_sample_32 typedef_enum_class_sample_32; enum class _enum_class_sample_64 : int64_t; typedef _enum_class_sample_64 typedef_enum_class_sample_64; #endif enum _enum_sample_32 { enum_sample_identifier_32 = 0x01020304 }; enum _enum_sample_64 : int64_t { enum_sample_identifier_64 = 0x0506070801020304 }; #ifdef __cplusplus enum class _enum_class_sample_32 { enum_class_sample_identifier_32 = 0x01020304 }; enum class _enum_class_sample_64 : int64_t { enum_class_sample_identifier_64 = 0x0506070801020304 }; #endif int main() { enum _enum_sample_32 e32 = enum_sample_identifier_32; enum _enum_sample_64 e64 = enum_sample_identifier_64; printf("value, sizeof( 32bit enum ) : %llx %lld\r\n", e32, sizeof(e32)); printf("value, sizeof( 64bit enum ) : %llx %lld\r\n", e64, sizeof(e64)); #ifdef __cplusplus typedef_enum_class_sample_32 ec32 = typedef_enum_class_sample_32::enum_class_sample_identifier_32; typedef_enum_class_sample_64 ec64 = typedef_enum_class_sample_64::enum_class_sample_identifier_64; printf("value, sizeof( 32bit enum class typedef ) : %llx %lld\r\n", ec32, sizeof(ec32)); printf("value, sizeof( 64bit enum class typedef ) : %llx %lld\r\n", ec64, sizeof(ec64)); #endif return 0; }
環境
Windows 10
VisualStudio 2022

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/30 09:18 編集