2012-03-31 72 views
1

私はファイルlist.hhlistについてFreeBSDのソースコードを読んでいますが、私はこのマクロについて混乱しています:バイナリ "|"への無効なオペランド

#define hlist_for_each_entry_safe(tp, p, n, head, field)  \ 
for (p = (head)->first; p ?     \ 
    (n = p->next) | (tp = hlist_entry(p, typeof(*tp), field)) : \ 
    NULL; p = n) 

と私は以下のように私の機能に似たスタイルを使用しようとしています:

int *a; 
int *b; 
int *c; 

if(a ? (b = (int *)0x0c) | (c = (int *)malloc(sizeof(int)) : NULL){ 

    printf("test\n"); 
} 

私はGCCがそれをコンパイル使用する場合、コンパイラは私にエラーを与えるには、こう述べています。

invalid operands to binary "|" 

私は私のFUNCを書きます私は「for」循環の状態が「真」または「偽」を返すと考えているからです。実際、コンパイラは同じではないと私は言っているようです。そして、私は " for "と" if "です。

PS:私の母国語は英語ではありません。多分あなたはそれをよく理解できませんでした。それは残念です。 |演算子は整数のみで動作しますが、ポインタを操作しようとているようにそのコードが見えます - いくつかのファンキーなコードのように見える

+5

使用する行を表示できますか? –

+2

'n'と' tp'についてもっと教えてください。具体的には、目的とするタイプは何ですか?代わりに、 'hlist_for_each_entry_safe()'マクロが実際にコードのどこかで呼び出されていますか?もしそうなら、いかに正確に? – thb

+2

これは災害のレシピです。他の人のために働くかどうかは気にしないでください - あなた自身と他の人があなたのコードを使ってこれをしないでください。 – littleadv

答えて

0

ポインタで|を使用することはできません。積分型を使用する必要があります。あなたが引用しているFreeBSDコードについてはわかりませんが、uintptr_tを使用することがあります。

にかかわらず、littleadvが正しい。これをしないでください。それは読むことができず、維持不能なゴブリンギクです。

+0

私はそれが "|"について間違って書かれていると思います。おそらく彼らは "||" – MYMNeo

0

。私はちょうど->nextに基づいてセマンティクスについて推測していますが、それがポインタフィールドなら、このコードはあなたが見たように動作しません。

関連する問題