インタビューで、私は次のような質問に直面しました。
あなたの友人はあなたにフィボナッチ数をコンソールに印刷する単一のソースコードファイルを与えました。main()ブロックは空であり、その中にステートメントがないことに注意してください。
これがどのように可能であるかを説明してください(ヒント:グローバルインスタンス!)
私は本当にこれについて知りたいです、どうしてそのようなことが可能であるのか!
インタビューで、私は次のような質問に直面しました。
あなたの友人はあなたにフィボナッチ数をコンソールに印刷する単一のソースコードファイルを与えました。main()ブロックは空であり、その中にステートメントがないことに注意してください。
これがどのように可能であるかを説明してください(ヒント:グローバルインスタンス!)
私は本当にこれについて知りたいです、どうしてそのようなことが可能であるのか!
assertor#pragma messageなどを使用して出力をログに記録することです。これにより、コンパイル中に出力がコンソールにリダイレクトされます。プログラムが完全にコンパイルされることは決してないかもしれませんが、これは確かに面接中にあなたの「すぐに使える」考えを示すための楽しい方法です。これは、生成されるバイナリについては何も言及していないため、引用された質問を満たします。むしろ、コンソールに「もの」を表示できるCファイルについて話しているだけです。;-)
回答:
ほとんどの場合、次のように実装されます(またはその変形):
void print_fibs()
{
//implementation
}
int ignore = (print_fibs(), 0);
int main() {}
このコードでは、関数ignoreに入る前にグローバル変数を初期化する必要がありますmain()。ここで、グローバルを初期化print_fibs()するには、何でもできる場所で実行する必要があります。この場合、フィボナッチ数を計算して出力します。私が次の質問で示したのと同様のこと(私はずっと前に尋ねました):
このようなコードは安全ではないため、一般的には避けるのが最善であることに注意してください。たとえば、実行std::cout時にオブジェクトが初期化print_fibs()されない場合があります。初期化されている場合std::cout、関数はどうなりますか?ただし、他の状況でそのような初期化順序に依存しない場合は、初期化関数を呼び出しても安全です(これはCおよびC ++では一般的な方法です)。
std::ios_base::Initオブジェクトの最初の初期化の前または最中に初期化されることが保証されています。また、名前空間スコープにオブジェクトの<iostream>インスタンスが含まれているかのように動作することが保証さstd::ios_base_Initれています。
bool、と変数を返すこともできますbool fibsPrinted。関数がここでのみ機能する場合は、おそらく少しクリーンです。(しかし、違いはおそらく心配するのに十分ではありません。)
std::coutライブラリのどこかにあります。しかし、すでに指摘したように、標準では、std::ios_base::Initオブジェクトの最初のコンストラクターが終了する前に初期化する必要があり<iostream>、std::ios_base::Initオブジェクトが名前空間スコープで定義されているかのようにインクルードが動作する必要があります。<iostream>初期化されるオブジェクトの定義の前に変換ユニットが含まれている場合、std::cout構築されることが保証されます。
はい、可能です。オブジェクトコンストラクターでフィボナッチ数を計算するオブジェクトのグローバルインスタンスを宣言する必要があります。
ファイルスコープオブジェクトのすべての[*]コンストラクターはmain、非オブジェクトファイルスコープ変数のすべての初期化式と同様に、に到達する前に呼び出されます。
編集:また、すべてのファイルスコープオブジェクトのall [*]デストラクタは、main終了後に構築の逆の順序で呼び出されます。理論的には、フィボナッチプログラムをオブジェクトのデストラクタに入れることができます。
[*]「all」は、プログラムが直接リンクされていないライブラリを動的にロードおよびアンロードする動作を無視することに注意してください。ただし、これらは技術的には基本C ++言語の範囲外です。
main?
mainは空であるため、これらのDLL / DSOはデストラクタによってロードされる必要がありますが、これはひねくれたものです。しかし、これはコンピュータサイエンスなので、「すべて」のような言葉には注意が必要だと思います。