問題:
C で同じ enum 変数型に割り当てるときに enum 要素をキャストする必要があるのはなぜですか?
MISRA C 2012 ルール 10.3に失敗したため、このコードに問題がありました。
式の値は、より狭いエッセンシャル タイプまたは別のエッセンシャル タイプ カテゴリのオブジェクトに割り当てられません。
コードは次のとおりです。
typedef enum
{
FLS_PROG_SUCCESS,
FLS_PROG_FAIL,
FLS_ERASE_SUCCESS2U,
FLS_ERASE_FAIL,
FLS_READ_SUCCESS,
FLS_READ_FAIL,
FLS_FORMAT_SUCCESS,
FLS_FORMAT_FAIL
}FLS_JobResult_t;
void Foo(void)
{
FLS_JobResult_t ProgramStatus;
/* Then I try to initialize the variable value */
ProgramStatus = FLS_PROG_SUCCESS;
...
}
そして、ツールに欠陥がある可能性があることを示唆する回答を受け入れました. 私はまだそれを信じていますが、それを修正しようとしてだまされて、現在の typedef enum 宣言に名前を付けました。
typedef enum FLS_JobResult_tag
{
FLS_PROG_SUCCESS,
FLS_PROG_FAIL,
FLS_ERASE_SUCCESS2U,
FLS_ERASE_FAIL,
FLS_READ_SUCCESS,
FLS_READ_FAIL,
FLS_FORMAT_SUCCESS,
FLS_FORMAT_FAIL
}FLS_JobResult_t;
そして、私が知る限り、両方ともまったく同じです。しかし、その後、驚き!エラーが消えました!ルール チェッカーはこれをエラーとしてフラグ付けしなくなりました!!
次に、いくつかの調査を行ったところ、次の2つの質問が見つかりました。
C でのこれら 2 つの typedef スタイルの違いは何ですか?
と
そして、匿名の列挙型と名前付きの列挙型には微妙な違いがあることに気付きました。しかし、ルール チェッカーが別の形式について不平を言う理由を明確にするものは何もありません。
問題は、MISRA c 2012 のルール 10.3 に違反する可能性のある匿名列挙型と名前付き列挙型の違いは何ですか?