13

私は最近、次のようなコードに出くわしました。

if(sizeof(var,2) == 4) { ... }

varタイプはどこですか)

sizeofオペレーターにとって2つの引数のように見えるものを見て、私は非常に驚きました。ISO / ANSI C99規格をすばやくスキャンしても、秘密は見つかりませんでした。そこにコンマを許可する文法の読み方を思い付くことができませんでした。

Googleコードを検索すると、いくつかのPPCコードでこの構文の例を見つけることができました。

これはPPC固有の構文ですか?どういう意味ですか?

編集:私が見ていたものとリンクされたコードの両方が、WindRiverDiabコンパイラに固有の構文であることがわかりました:

sizeof(type、int-const):

int-constが0の場合、 sizeofはタイプのバイト単位のサイズを返します。

int-constが1の場合、 sizeofは型の配置を返します。

int-constが2の場合、 sizeofは、型の型を指定する整数定数を返します。値については、 Diab C /C++ユーザーズガイドで「sizeof演算子」を検索してください 。

うわー、彼らは本当にsizeof演算子の意味を過負荷にしました。

EDIT2:完全なドキュメントはここにあります:http ://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3001432

4

5 に答える 5

9

さらに調査したところ、これはWindRiverDiabコンパイラに固有の動作であることがわかりました。詳細については、質問の編集を参照してください。

于 2009-06-08T17:59:00.007 に答える
3

私には、最初の引数を評価し、結果を破棄してから2番目の引数を評価するコンマ演算子の単純なアプリケーションのように見えます。

この場合、リテラルの2サイズが4であるかどうかを判別します。" var"の部分は関係ありません。

于 2009-06-08T17:41:33.950 に答える
1

赤いニシンのように見えます。私の推測では、誤ってコンマ演算子を使用していて、sizeofが最後の値に適用されていると思います。

于 2009-06-08T17:43:21.263 に答える
0

前述のように、コンマ演算子が適用され、sizeofは整数リテラルのサイズを返します。オフハンドでは、これは作成者側のエラーのように見えますが、不吉なコーディングが行われている可能性があります。

sizeof式は評価されないため、多くのトリッキーなことに使用できます。1つの例は、コンパイラーにコードを生成させずに、参照されていない変数の参照を提供することです。例については、より適切なアサートマクロの作成に関するこの記事を参照してください。Alexandrescuには、メモリが役立つ場合、Modern C++Designでのsizeofトリックの例がいくつかあります。これらの非自明な使用法の1つが意図されている可能性はありますが、可能性は低いです。

使用法が何であれ、この状況でコメントされていない場合は、読みやすさのトレードオフの価値がないことは明らかであり、変更する必要があります。

于 2009-06-08T17:52:00.517 に答える
0

重要な免責事項:以下のコードは擬似コードです。sizeofの引数が実際に評価されることはなく、「実行済み」の意味で、常にコンパイル時の構成になります(したがって、列挙型など、テンプレート作成者が好むツールの1つです)。

auto以下でC++(0x)から借用したことに注意してください。初期化式から型を推測するようにコンパイラーに指示し、例を少し単純にします

sizeof多くの人が知らないのは、次のように有効に呼び出すことができるということです。

auto s = sizeof int;

つまり、括弧は必要ありません。したがって、(x、y)をに渡すと、次のようにsizeofなります。

auto c = (x,y);
auto s = sizeof c;

あるいは単に

auto c = x,y;
auto s = sizeof c;

x,yはシーケンスであり、各部分は左から右に評価され、シーケンスは最後の部分の値を取得します。この場合、これはyです。したがって、元のコードはほぼ同等です

auto s = sizeof y;

したがって、問題のコンパイラは、他のコンパイラでもコンパイルできるが、まったく異なる意味を持つ拡張機能を導入するという点で、本当に、本当に頭がおかしいことをしているように見えます。これは悪いです。

于 2011-06-17T11:45:18.453 に答える