21

プロジェクトで固定長整数型に切り替えた主な理由は、使用時に整数サイズについてより明確に考えるのに役立つからです。それらを介して含める#include <inttypes.h>と、印刷マクロなどの他のマクロも多数含まれPRIu32ますPRIu64...

定数値を固定長変数に代入するには、UINT32_C()や などのマクロを使用できますINT32_C()。定数値を代入するたびに、それらを使い始めました。

これにより、次のようなコードが生成されます。

uint64_t i;
for (i = UINT64_C(0); i < UINT64_C(10); i++) { ... }

今、私はそれを気にしないいくつかの例を見ました. 1 つはstdbool.hインクルード ファイルです。

#define bool    _Bool
#define false   0
#define true    1

bool私のマシンではサイズが 1 バイトなので、int. ただし0、 and1は、コンパイラによって自動的に適切な型に変換される整数である必要があります。私の例でそれを使用すると、コードははるかに読みやすくなります。

uint64_t i;
for (i = 0; i < 10; i++) { ... }

では、いつ固定長定数マクロを使用する必要がUINT32_C()あり、いつその作業をコンパイラーに任せるべきですか (私は GCC を使用しています)? MISRA C でコードを書くとどうなりますか?

4

2 に答える 2

5

経験則として、リテラルの型が重要な場合はそれらを使用する必要があります。考慮すべき点が 2 つあります。サイズと符号です。

サイズについて:

型は までのintC 標準値によって保証され32767ます。よりも小さい型の整数リテラルを取得できないため、 よりintも小さい値はすべて32767マクロを使用する必要はありません。より大きな値が必要な場合は、リテラルの型が問題になり始めるため、それらのマクロを使用することをお勧めします。

署名について:

接尾辞のない整数リテラルは通常、符号付きの型です。これは、暗黙的な型の昇格中にあらゆる種類の微妙なバグを引き起こす可能性があるため、潜在的に危険です。たとえば(my_uint8_t + 1) << 31、32 ビット システムでは未定義の動作バグが発生しますが、発生しませ(my_uint8_t + 1u) << 31ん。

これが、MISRA が、意図的に符号なし型を使用する場合は、すべての整数リテラルにu/Uサフィックスを付ける必要があるという規則を設けている理由です。したがって、上記の例では を使用できますmy_uint8_t + UINT32_C(1)1u、おそらく最も読みやすい を使用することもできます。MISRA ではどちらでも問題ありません。


stdbool.h が true/false を 1/0 と定義している理由については、標準で明示的にそう規定されているためです。C のブール条件は、下位互換性の理由から、C++ のような型intではなく、型を使用します。bool

ただし、C が真のブール型を持っているかのようにブール条件を扱うのは良いスタイルと考えられています。MISRA-C:2012 には、本質的にブール型と呼ばれるこの概念に関する一連の規則があります。これにより、静的解析時の型安全性が向上し、さまざまなバグも防止できます。

于 2016-11-28T10:41:37.873 に答える
3

これは、コンテキストによってコンパイラが正しいサイズにキャストしない小さな整数リテラルを使用するためのものです。

私は、int16 ビットとlong32 ビットの組み込みプラットフォームに取り組んできました。16 ビット型または 32 ビットint型のプラットフォームで動作する移植可能なコードを作成しようとしていて、32 ビットの「符号なし整数リテラル」を可変引数関数に渡したい場合は、次のキャストが必要です。

#define BAUDRATE UINT32_C(38400)
printf("Set baudrate to %" PRIu32 "\n", BAUDRATE);

16 ビット プラットフォームでは、キャストは を作成38400ULし、32 ビット プラットフォームでは38400U. これらは、 または のいずれかのPRIu32マクロに一致します。"lu""u"

(uint32_t) Xほとんどのコンパイラは、UINT32_C(X)whenXが整数リテラルの場合と同じコードを生成すると思いますが、初期のコンパイラではそうではなかったかもしれません。

于 2016-11-28T02:07:58.583 に答える