1. ホーム
  2. c++

#include すべての .cpp ファイルを単一のコンパイル単位にしますか?

2023-08-29 13:06:54

質問

私は最近、いくつかの Visual Studio C++ プロジェクトで、通常の Debug と Release の構成に加えて、これまで見たことのない 'Release All' と 'Debug All' の構成で作業する必要がありました。

プロジェクトの作成者は、他のすべての .cpp ファイルを #include する単一の ALL.cpp を持っていることがわかりました。All 設定は、この 1 つの ALL.cpp ファイルを構築するだけです。もちろん、これは通常の構成からは除外され、通常の構成は ALL.cpp を構築しません。

私はただ、これが一般的なやり方なのかどうか疑問に思っていました。それはどのような利点をもたらすのでしょうか。(私の最初の反応は、悪いにおいがするということでした)。

これにはどのような落とし穴がありそうですか?私が思いつくのは、.cpps に匿名の名前空間がある場合、それらはもはやその cpp に対して「プライベート」ではなく、他の cpps でも見えるようになることですか?

すべてのプロジェクトは DLL をビルドするので、匿名の名前空間にデータを持つことは良いアイデアではありませんよね。しかし、関数はOKでしょうか?

どのように解決するのですか?

これは "Unity Build" と呼ばれています(ググれば出てきます)。非常に高速にリンクし、適度に速くコンパイルできます。これは、中央サーバーからのリリース ビルドのように、反復する必要のないビルドには最適ですが、必ずしもインクリメンタルなビルドには適していません。

そして、メンテナンスが大変です。

EDIT: 詳細は最初のグーグルリンクをどうぞ。 http://buffered.io/posts/the-magic-of-unity-builds/

高速になるのは、コンパイラがすべての .cpp ファイルに対してそれを行うのではなく、一度すべてを読み込んでコンパイルし、それからリンクする必要があるだけだからです。

Bruce Dawson は、彼のブログでこれに関してより良い記事を書いています。 http://randomascii.wordpress.com/2014/03/22/make-vc-compiles-fast-through-parallel-compilation/