2017-05-25 162 views
2

STRAIGHTFORWARDコードは私にgccの警告"cast to pointer from integer of different size [-Wint-to-pointer-cast]"を与えます。 それはSTRAIGTHFORWARDのキャストが違法であることを意味しますか?ポインタから異なるサイズの整数へのキャスト

#include <pthread.h> 
#include <signal.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 

void *thr(void *Arg) 
{ 
#if STRAIGHTFORWARD 
    printf("i=%d\n", (int)Arg); 
#else 
    printf("i=%d\n", (int)(intptr_t)Arg); 
#endif 
    return 0; 
} 
int main() 
{ 
    pthread_t tids[4]; 
    for(int i=0; i < sizeof tids/sizeof tids[0]; i++){ 
#if STRAIGHTFORWARD 
     pthread_create(tids+i, 0, thr, (void*)i); 
#else 
     pthread_create(tids+i, 0, thr, (void*)(intptr_t)i); 
#endif 

    } 

    pthread_exit(0); 

} 

答えて

4

ことはSTRAIGTHFORWARDキャストが違法Cであることを意味していますか?

違法ではないにしても、高度に定義された実装です。コンパイラは潜在的な落とし穴を警告しようとしています。 C11を引用

、§6.3.2.3

任意のポインタ型は、整数型に変換することができます。前に指定した場合を除き、 の結果は実装定義です。結果が整数型で表現できない場合は、 の動作は未定義です。結果は任意の整数 タイプの値の範囲内にある必要はありません。

だから、intptr_tuintptr_tが存在します。 (int)(intptr_t)Argも目的に反し、言っ

は、intintptr_t間のサイズの互換性の保証はありませんので、キャストがintptr_tないものな限りエラーが発生しやすくなります。

+0

intptr_tはそこにあります。なぜなら、警告を消すためです:Dありがとうございます。 – PSkocik

+0

明示的にそのOPsを追加することを提案する '(int)(intptr_t)Arg)'はコンパイラの警告を止めるだけですが、 'int'が' void * 'よりも実際に小さい場合にも同様の問題が発生します。 –

+0

。 – PSkocik

関連する問題