2009-10-23 10 views
13

sizeofは演算子であり、コンパイル時に整数定数と評価されることを理解しています。 しかし、それのように、それはの#ifプリプロセッサディレクティブで使用することができないようです。このような使用ではない理由(cygwinの-gccの3.4.4などのVisual C++ 6.0レポートコンパイルエラー)なぜprepofcessor条件でsizeofを使用できないのですか?

#if 4 == sizeof(int) 
    typedef int Int32; 
#endif 

許可されている?

答えて

19

ディレクティブは前にコンパイルを評価され、それが何sizeof手段を理解することはありませんので、それを行う部分は、コンパイラではありませんされている間sizeofは、コンパイル時に評価されているので。

+1

実際に前処理は、コンパイル時に行われ、以前のフェーズのいずれかで行われます。 'sizeof'の評価は後の段階で行われます。 – sbi

+4

@sbi前処理はコンパイルの一部ではありません。コンパイラは通常、実際のコンパイルの前にプリプロセッサを実行しますが、そうしないようにコンパイラに指示できます。 RichNの答えは100%正しいです。 – qrdl

+0

さて、私は間違っていましたが、専門用語でしかありません。それは_翻訳の段階の1つです。このhttp://stackoverflow.com/questions/1476892/1479972#1479972によれば、「コンパイル」と呼ばれるフェーズは存在しません。その意味は、解釈にオープンなようです。 – sbi

10

sizeofはC演算子です。プリプロセッサディレクティブにCコードを使用することはできません。プリプロセッサ指令は、コンパイルが行われる前に評価されます。

+0

あなたは彼らの最初を持っています! –

+0

"=="も演算子です。 RichNからの答えは、私にとっては問題が少しはっきりしていると指摘しています。 – felix0322

+2

@ felix0322:プリプロセッサには、プリプロセッサディレクティブで使用される独自の '=='演算子があります。 – sbi

関連する問題