2012-01-23 1 views
2

私はそれがC++は、すべての種類のいずれかのあいまいさに対応していないようですが、なぜC++は型のないパラメータの宣言を禁止していますか?

理由です、そしてどのように

int arrayLength(`anyType` array[]) 
{ 
    return sizeof(array)/sizeof(array[0]); 
} 

、任意の配列のための一般的な方法として、以下の方法を持っていると思います私はそれを回避するために行く必要がありますか?

+8

'template std :: size_t arrayLength(T(&)[N]){return N; } ' – ildjarn

+0

重複:http://stackoverflow.com/questions/4415524/common-array-length-macro-for-c –

+0

別の関連のスレッド:http://stackoverflow.com/questions/95500/can-this-macro -ab-converted-a-function – Troyseph

答えて

3

タイプをスタックにプッシュしてからポップバックする必要があり、sizeofタイプがsizeofタイプと等しくないためです。

機能間のスタック上に渡される種類のサイズが事前に固定または知られていない場合は、どのようにコンパイラは、関数をコンパイルすることができますか?

この問題の解決策は、テンプレートとマクロの両方であり、どちらも動的にコードを生成し、コンパイル時には「」と表示されます "問題ですが、実際にはコンパイラに作業を負わせることによって、それを取り除く、またはそれから邪魔するだけです。 Visual Cで

1

++同じことを__countof()構文があります。これは、C++コンパイル用のテンプレートとして、またC用のマクロとして実装されています。(真の配列とは対照的に)ポインタで使用すると、C++バージョンのエラーは出力されません。

1

私はあなたが本当に求めているのは「なぜC++は静的型付けを主張するのですか?

答え:それは言語は静的型付けを使用している場合は小型で高速なプログラムを生成するコンパイラを書くことが容易だからです。これはC++の目的です.Cで書かれていれば、複雑ではない比較的小さなプログラムを作成します。

私は「小」と言っていますが、必要なランタイムライブラリのサイズを含めています。

関連する問題