2012-01-20 4 views
1

私は与えられたコードを理解しようとしています。 pthread_createと同様に動作します。start_routineへのポインタを渡します。このポインタには、voidのポインタargを引数と引数ポインタとして受け取り、次にpthread_createが関数を呼び出します。マクロを使ってpthreadのstart_routine引数をキャストする

通常、start_routineには引数が必要な場合はvoid *は必要ありませんが、argは構造体へのポインタにキャストする必要があります。

void *my_start_routine(void *arg) 
{ 
#define p ((struct my_struct *) arg) 
    // use p many times 

#undef p 
} 
を:

void *my_start_routine(void *arg) 
{ 
    struct my_struct *p = arg; 
    // use p many times 
} 

しかし、私はちょうど著者が毎回pが使用されているキャストを行うには、マクロを設定し、コードを受け取っ:過去には、私はこのように私のstart_routine sがコード化されてきました

なぜあなたはこれをやりたいのか分かりません。しかし、私はそれが熟考されていると仮定しています。なぜなら、最初の方法よりも難しく、あまり明白ではないように見えます。ここでマクロを好む理由やパフォーマンス、その他の理由はありますか?

答えて

1

あなたのイディオムが望ましいです。他の人のマクロで、私の意見では、同様の理由から、憎悪、されています

  • pはそれがargへの変更がpに影響を与えることは自明だ左辺値
  • ではありません。
  • デバッガには何もわからないpです。
  • ...
+0

ありがとう、すべて。それは、生徒が別の生徒のコードを理解しようとしている場合、つまり、視覚障害者が視覚障害者を誘導しているケースです。説明がつかない何かに出くわしたとき、私が愚かであるか、狂っているか決して決めることができないことは、あまり知られていません。 –

0

私が見ることのできる唯一の違いは、pのスタックにスペースが割り当てられないことですが、これは機能の開始時に一度だけ実行されるため、やや疑わしい最適化であり、コンパイラによって何らかの形で出力されます。

インライン関数(または独自の最適化を行うコンパイラ)やグループ化定数(エラーコードなど)が列挙型として優れているため、現在のところ非常に単純な置換のためだけにプリプロセッサを使用する傾向があります。

+1

良いコンパイラは、いずれかの領域を割り当て、単にすでに引数に予約された領域を再利用しないでしょう。 –

関連する問題