8

msvs 2010 を使用して、次の git で見つかったプロジェクトをビルドしようとしています。

https://github.com/Joonhwan/exprtk

問題は、exprtk.hpp ファイルの 48 行目の '#define exprtk_lean_and_mean' をコメント アウトすると、次のコンパイラ エラーが発生することです。

Error   1   error C1128: number of sections exceeded object file format limit : compile with /bigobj

エラーをグーグルで調べると、コンパイルされた翻訳単位が任意の制限よりも大きなものにコンパイルされたことを示しているようで、コマンドラインに 'bigobj' を追加すると問題が解決するはずです (これは解決します)。gcc (4.3) でコードをコンパイルすると、問題なく動作します。

私の質問は次のとおりです。

  1. c++ は、翻訳単位で持つことができる型の数に制限を設けますか?

  2. このプロジェクトでコードを配置する方法は悪い習慣ですか? (グーグルで検索すると、多くのブーストライブラリに同じ問題があることに気付きました.Boost.Spritなど)

4

2 に答える 2

14

c++ は、翻訳単位で持つことができる型の数に制限を設けますか?

そのようなパラメータの最大値は、特定の実装のために開いたままになっていることに注意してください。標準は、実装によってサポートされなければならない最小要件のみを強制します。実装は、サポートする最大値を文書化します。この場合、MSVC 実装はこれを行います。

これらは、C++ 標準の特別なセクションで定義されています。

附属書 B - 実装数量

  1. コンピューターは有限であるため、C++ の実装では、正常に処理できるプログラムのサイズが必然的に制限されます。すべての実装は、既知の場合、それらの制限を文書化する必要があります。このドキュメントでは、固定された制限が存在する場合に引用したり、利用可能なリソースの関数として可変制限を計算する方法を述べたり、固定された制限が存在しないか不明であると述べたりする場合があります。

  2. 制限により、以下に説明するものやその他のものを含む数量が制限される場合があります。各数量に続く括弧内の数字は、その数量の最小値として推奨されます。ただし、これらの量は単なるガイドラインであり、準拠を決定するものではありません。
    — 複合文、反復制御構造、および選択制御構造のネスト レベル [256]。
    — 条件付き包含の入れ子レベル [256]。
    — 宣言内の算術、構造、共用体、または不完全な型を変更するポインタ、配列、および関数の宣言子 (任意の組み合わせ) [256]。
    — 完全な式内の括弧で囲まれた式のネスト レベル [256]。
    — 内部識別子またはマクロ名の文字数 [1024]。
    — 外部識別子の文字数 [1 024]。
    — 1 つの翻訳単位の外部識別子 [65 536]。
    — 1 つのブロックで宣言されたブロック スコープを持つ識別子 [1 024]。
    — 1 つの翻訳単位で同時に定義されるマクロ識別子 [65 536]。
    — 1 つの関数定義のパラメーター [256]。
    — 1 つの関数呼び出しの引数 [256].**
    — 1 つのマクロ定義のパラメーター [256]。
    — 1 回のマクロ呼び出しでの引数 [256]。
    — 1 つの論理ソース行の文字 [65 536]。
    — 文字列リテラルまたはワイド文字列リテラルの文字 (連結後) [65 536]。
    オブジェクトのサイズ [262 144] .
    — #include ファイルのネスト レベル [256]。
    — switch ステートメントのケース ラベル (ネストされた switch ステートメントのラベルを除く) [16 384]。
    — 単一のクラス、構造体、または共用体のデータ メンバー [16 384]。
    — 単一の列挙における列挙定数 [4 096]。
    — 単一の struct-declaration-list [256] 内のネストされたクラス、構造、または共用体定義のレベル。
    — atexit()[32] によって登録された関数。
    — 直接および間接基本クラス [16 384]。
    — 単一クラスの直接基本クラス [1024]。
    — 単一のクラスで宣言されたメンバー [4 096]。
    — クラス内の仮想関数の最終的なオーバーライド、アクセス可能かどうか [16 384]。
    — クラスの直接および間接仮想ベース [1 024]。
    — クラス [1 024] の静的メンバー。
    — クラスのフレンド宣言 [4 096]。
    — クラスのアクセス制御宣言 [4 096]。
    — コンストラクター定義のメンバー初期化子 [6 144]。
    — 1 つの識別子の範囲限定 [256]。
    — ネストされた外部仕様 [1 024]。
    — テンプレート宣言のテンプレート引数 [1 024]。
    — 再帰的にネストされたテンプレートのインスタンス化 [17]。
    — try ブロックごとのハンドラー [256]。
    — 単一の関数宣言で仕様をスローする [256]。

于 2012-05-14T05:56:19.787 に答える
7

制限は、古いバージョンの MSVC および対応するリンカーで使用される OBJ 形式内にあります。したがって、この制限は任意ですが、新しいバージョンのコンパイラのデフォルトの動作にすることはできません。/bigobjオプションの説明を確認してください。

Visual C++ 2005 より前に出荷されたリンカーは、/bigobj で生成された .obj ファイルを読み取ることができません。

于 2012-05-14T05:56:32.257 に答える