web-dev-qa-db-ja.com

コンパイラがintをvoidポインタキャスト警告に表示しないようにする方法

私はintからvoid *へ、またはその逆に多くのキャストを行うコードをいくつか持っています(それが醜いかどうかは気にしません。私は一般的なものを持っているのが好きです)

例:

typedef struct _List {
    long size;
    long mSize; // Max size
    void** elementArray;
}List;

List l;
...
int i = 2;
l.elementArray[i] = i; // Intentional usage of pointer as integer
// Actual size of pointer does not matter

しかし、私がコンパイルすると、私は何億ドルも得る

 warning: cast to 'void *' from smaller integer type 'int' [-Wint-to-void-pointer-cast]

警告。この特定の警告を出力しないようにgccに指示するフラグはありますか?

私は-Wallでコンパイルしているので、これを簡単になくすことができるかどうかはわかりません

11

どうやらコンパイラがあなたに与えるフラグを取り、その前に「ノー」を叩くだけでうまくいくようです!

-Wno-int-to-void-pointer-cast

私のような答えを探している可能性のある他の人のために:

インタビューを誤って別の場所でvoid *にアップキャストしている可能性があるため、コンパイルフラグを追加したくない場合は、次のスニペットを使用して、intからvoid *にキャストを強制することができます。あなたはそれが起こることを望みます、そしてそれからコンパイラはキャストについてあなたを悩ませません:

#define INT2VOIDP(i) (void*)(uintptr_t)(i)

もちろん、必ずstdint.hを含めるようにしてください。そうすれば、次のことができます。

void *val = INT2VOIDP(5);
18
DanZimm

'size_t'を使用することをお勧めします。

たとえば、intiとvoid * aがある場合、

i = (void *) a;はその警告を出します

これを回避するには、size_tを追加します

i = (void *) (size_t) a;

8
Vasu

場合によっては、これを行うことが望ましい場合があります(たとえば、OpenGLのglVertexAttribPointerの最後のポインターパラメーターの場合)。次のようなことを行うことで、警告を回避できるはずです。

#define BUFFER_OFFSET(i) ((char*)NULL+(i))
myFunction(BUFFER_OFFSET(3));
3
Quig

警告は、intがポインタよりも狭いことを示しているため、ポインタからintにキャストすると情報が失われます。上で提案したように、uintptr_tを使用します。これは、ポインタと同じ幅の整数型です。 intの使用を余儀なくされた場合、あなたはSOLです。 "Generic" ==壊れています。

0
pat