2016-09-27 11 views
1

私はCコードの次のビットを理解しようとしています。結果を使わずにvoidへの構造体ポインタをキャストする目的

static unsigned 
parent(const struct binheap *bh, unsigned u) 
{ 
    (void)bh; 
    return (u/2); 
} 

(void)bh;の目的は何だろうか?それは何にも割り当てられておらず、出力に影響を与えるべきではありません。私が考えることができる唯一の目的は、恐らくヌルポインタに対するある種のアサーションのようなものかもしれない。

コンテキストの場合、そのスニペットはthe original implementationからB-heapです。そのコードは他の場所でもあまりにも巧妙である傾向があります。 Nで分割するfor (unsigned n = 2; n; n += n) {をやっ= 65536

答えて

1

(void)bh;は、生成されたコードには、の効果がありません。しかし、多くのコンパイラでは、コンパイラが関数内で使用されていないパラメータbhに関する警告を出さないようにします。これはプログラマの意図であることがほぼ確実です。構造ポインタであるbhは無関係です。この技法がまったく機能するならば、未使用のパラメーターのタイプに関係なく機能します。

static unsigned 
parent(const struct binheap *, unsigned u) 
{ 
    return (u/2); 
} 

を - - しかし、Cがこれをサポートしていません

C++はあなたが必要としない任意の引数の変数名を省略することができ、これを実現するために、よりエレガントな方法があります。コンパイラの中には、同じ目的のために拡張機能を持つものもあれば、それほどエレガントではないものもあります。 GCCの

static unsigned 
parent(const struct binheap *bh __attribute__((unused)), unsigned u) 
{ 
    return (u/2); 
} 

(void)bh;トリックは、ISO Cの機能だけを使用して、未使用のパラメータの警告を抑制するための唯一の技術です。一方、それが動作することは保証されていません。コンパイラが発行する警告は完全にそのコンパイラに依存します。したがって、あなたが何をしていても実装定義の領域に入っています。

1

これは典型的には回避コンパイラの警告に行われます。たとえば、-Wall -Wextragccにコンパイルすると、キャストを無効にしない場合は、bhを使用していないことを警告します。

1

これは単に、未使用の変数に対するコンパイラの警告を避けるためです。そこにキャストがなければ、コンパイラは(を試してを試してください)、あなたのコードに未使用の変数があることを警告します。

1

変数が関数内で使用されていないとき

いくつかのコンパイラが警告を投げるコンパイラの警告ので。

警告

$ gcc -Wunused-parameter a.c                                                        
a.c:3:16: warning: unused parameter 'a' [-Wunused-parameter] 
void hello(int a, int b) 
      ^
1 warning generated. 
を見るために、以下のようにそれをコンパイル
#include <stdio.h> 

void hello(int a, int b) 
{ 
    int i = b + 1; 
    printf("hello %d\n", i); 
    return; 
} 

int main(void) 
{ 
hello(10, 20); 
return 0; 
} 

の下を参照してください。

関連する問題