3

libbtbbを Androidにクロスコンパイルする作業を行っていますが、次のような大量の警告が表示されます。

jni/libbtbb/bluetooth_packet.h:67: warning: integer constant is too large for 'long' type

ただし、ファイルを掘り下げると、これは次の行を指します。

static const uint64_t sw_matrix[] = {
    0xfe000002a0d1c014, 0x01000003f0b9201f, 0x008000033ae40edb, 0x004000035fca99b9,
    0x002000036d5dd208, 0x00100001b6aee904, 0x00080000db577482, 0x000400006dabba41,
    0x00020002f46d43f4, 0x000100017a36a1fa, 0x00008000bd1b50fd, 0x000040029c3536aa,
    0x000020014e1a9b55, 0x0000100265b5d37e, 0x0000080132dae9bf, 0x000004025bd5ea0b,
    0x00000203ef526bd1, 0x000001033511ab3c, 0x000000819a88d59e, 0x00000040cd446acf,
    0x00000022a41aabb3, 0x0000001390b5cb0d, 0x0000000b0ae27b52, 0x0000000585713da9};

型は uint64_t で、「long」ではないのですが… 0xfe000002a0d1c014のように定数を指定することを指しているようです。この場合、他にどのように指定すればよいか、またはこれらの警告を無視できるかどうかがわかりません。

4

2 に答える 2

7

ULL64 ビット整数定数に接尾辞を追加するか、 の詳細UINT64_Cマクロでそれらを囲みますstdint.h

static const uint64_t sw_matrix[] = {
    0xfe000002a0d1c014ULL, /* etc. */ };

また

#include <stdint.h>

static const uint64_t sw_matrix[] = {
    UINT64_C(0xfe000002a0d1c014), /* etc. */ };
于 2012-07-27T15:47:17.200 に答える
3

C 標準の 1989/1990 バージョンでは、16 進整数定数の型は、その値を表すことができるこのリストの最初の型です。

  • int
  • unsigned int
  • long int
  • unsigned long int

そのバージョンの言語には nolong longまたはunsigned long longtype がありませんでした。

標準の 1999 年版では、このリストは次のように変更されました。

  • int
  • unsigned int
  • long int
  • unsigned long int
  • long long int
  • unsigned long long int

gcc を使用しているようです。gcc はデフォルトで C89/C90 をいくつかの GNU 固有の拡張機能で認識します。私の理解では、それは型long longunsigned long long拡張として提供しますが、整数定数のセマンティクスは変更しません。

引数を指定して gcc を呼び出すと-std=c99、C99 標準に準拠 (しようと) し、警告は消えます (ソース コードを変更する必要はありません)。

ソースを変更して、 なしで警告なしでコンパイルする場合、接尾辞を-std=c99追加するULLと、定数が 型になりますunsigned long long。これはおそらくと同じ型uint64_tですが、保証はされません。UINT64_C()マクロを使用すると、それらが正しいタイプであることを確認できますが、少し冗長です。

于 2012-07-27T17:42:35.360 に答える