2016-05-04 18 views
5

を持つI次のコードを持っている:問題のtypedefと配列

typedef float vec3_t[3]; 

void f(const vec3_t v[2]){ 
    // do stuff 
} 

int main(int argc, char * argv[]){ 
    vec3_t v[2]; 
    v[2][1] = 1; 
    f(v); 
    return 0; 
} 

gcc main.c -std=gnu99 -O0 -o main 

を使用してコンパイルしますが、エラーを与えることはありません

main.c: In function ‘main’:' 
main.c:293:5: warning: passing argument 1 of ‘f’ from incompatible pointer type [enabled by default] 
    f(v); 
    ^
main.c:286:6: note: expected ‘const float (*)[3]’ but argument is of type ‘float (*)[3]’ 
void f(const vec3_t v[2]){ 
    ^

の場合一方、関数fのconst要件を削除します。それはすべてうまくいく。私は何が間違っているのか理解できませんか?

+0

も参照してください:http://stackoverflow.com/questions/28062095/pass-a-two-dimensional-array-to-a-function-of-constant-parameter –

+0

私のデュープリンクで述べたように、おそらくこれはCタイプのシステムの欠陥です。これは、なぜtypedefの背後にあるポインタや配列を隠すのが良い考えではないのかを強調していると思います。 – user694733

+0

リンクされた質問は配列ポインタに関するものなので、正確な重複はありません。この場合、2D配列があります。答えはかなり同じでしょう。 – Lundin

答えて

0

なぜconstにパラメータをキャストしないのですか?

typedef float vec3_t[3]; 

void f(const vec3_t v[2]){ 
    // do stuff 
} 

int main(int argc, char * argv[]){ 
    vec3_t v[2]; 
    v[2][1] = 1; 
    f((const vec3_t*)v); 
    return 0; 
} 
+2

キャストに手を出すのは良い考えではありません。コンパイラは理由で不平を言う。あなたのコンパイラ以外のことが分かっていない限り、キャストするだけで遅かれ早かれトラブルにつながる可能性があります。 –

+0

C11 '_Generic'を使って安全な" constキャスト "を実装することは、リンクされた複製で議論された解決策の1つでした。例えば、chuxの回答を参照してください。それが良いアイデアかどうか、私は確信していません。しかしここでの生のキャストとは違って、100%安全です。 – Lundin