2
sizeof
がコンパイル時の演算子であるかを評価します。 See here。sizeof演算子は、コンパイルのどの段階でgcc
コンパイルには多くの段階があります。 sizeof
オペレータがどの段階で評価されていますか?
sizeof
がコンパイル時の演算子であるかを評価します。 See here。sizeof演算子は、コンパイルのどの段階でgcc
コンパイルには多くの段階があります。 sizeof
オペレータがどの段階で評価されていますか?
典型的には、プリプロセッサの実行後と前処理された翻訳単位(全ヘッダ#include
の代わりに貼り付けられたファイル、すべての場所で置換#define
年代、#ifdef
条件文の非アクティブな分岐が完全に除去、等)、コンパイラを生成します走る現代のコンパイラは、通常は前処理も可能ですが、歴史上の理由から、Cプリプロセッサ(cpp
)とCコンパイラ(cc
)は、少なくとも概念的に異なるものです。前者の出力は後者への入力として働く。
この段階では、これらの段階が何であるか、そしてその順序が何であるかは、完全にコンパイラの内部実装に依存します。しかし、最も伝統的なパイプラインは次のとおりです。
sizeof(int)
を表す抽象ノードの代わりに、たとえば4
を出力します。また、3 + 4
のような定数式を7
に噛み砕くでしょう。sizeof
は場合に実行時に評価されることに注意してください可変長配列(以降C99)に適用されます。すべては「コンパイル」の状態とは何
int n;
n = ...;
int vl_arr[n];
sizeof(vl_arr); // could be evaluated at runtime if "n" is not known at compile-time
? –
プリプロセッサを実行した後(プリプロセッサは 'sizeof'を認識しません)、オブジェクトファイルがアセンブラで作成されるかリンクされて実行可能ファイルが生成される前に評価されますので、メイン 'コンパイラ'で評価されます。プリプロセッサとコンパイラとアセンブラ(実際にはリンカ)はすべて1つのプログラムでも、複数のプログラムでもかまいません。標準は気にしない。例外はVLA可変長配列のサイズです。コンパイル時ではなく、実行時に評価する必要があるかもしれません。 –
@JonathanLeffler答えとして投稿する必要があります。 – Lundin