10

マクロは、次の仕様UINT8_Cで「stdint.h」に定義されています。マクロ、型に対応する整数定数式に展開されます。UINTN_C(value)uint_leastN_t

ただし、実際には、実装は異なります。

#define UINT8_C(value) ((uint8_t) __CONCAT(value, U))  // AVR-libc
#define UINT8_C(x_)    (static_cast<std::uint8_t>(x_)) // QP/C++
#define UINT8_C(c)     c                               // GNU C Library

最初の 2 つの実装はほぼ同じように見えますが、3 番目の実装は異なる動作をします: たとえば、次のプログラム1は AVR-libc と QP/C++ を使用して出力しますが-1、glibc を使用します (符号付きの値の右シフトは符号ビットを伝搬するため)。

std::cout << (UINT8_C(-1) >> 7) << std::endl; // prints -1 in glibc

の実装はUINT16_C同じ動作を表示しますがUINT32_C、定義にU接尾辞が含まれているため、 ではありません。

#define UINT32_C(c) c ## U

興味深いことに、glibc の の定義は、バグ報告により2006 年UINT8_Cに変更されました。以前の定義は でしたが、整数昇格規則により、誤った出力 ( )が生成されました。#define UINT8_C(c) c ## Ufalse-1 < UINT8_C(0)

3 つの定義はすべて標準に従って正しいですか? これら 3 つの実装の間に (負の定数の処理以外に) 違いはありますか?

4

3 に答える 3