E2177 異なる値で #pragma package 指令が再定義された(C++)

提供: Appmethod Topics
移動先: 案内検索

コンパイラのエラーと警告(C++):インデックス への移動

エラー E2177 が典型的に発生するのは、#pragma package(smart_init) がヘッダー ファイルで使用され(これは推奨されません)、そのヘッダー ファイルを #include でインクルードしているソース モジュールで別の #pragma package(smart_init) が使用されている場合です。このエラーで言及している異なる値(引数)とは、このヘッダー ファイルとソース ファイルのファイル名のことです。コンパイラでは、どちらのユニット名を使用すべきかを判断できません。

詳細

#pragma package(smart_init) 指令は、これがユニットであることをリンカに知らせるようにコンパイラに指示します。コンパイラでは、そのために、2 つのコメント レコードを生成します。つまり、ユニットの名前を指定するレコードと、ユニットのフラグを指定するレコードです。オブジェクト ファイルに対して tdump.exe を実行することにより、これらのレコードを参照できます。

"ユニット" オブジェクト ファイルを処理する際に、リンカではさらに解析を実行して、ユニットのグローバル オブジェクトを初期化する順序を決定します。この順序を求めるために、リンカでは、他の "ユニット" オブジェクト ファイルへの参照を調べます。なお、オブジェクト間に循環依存関係がある場合、それらオブジェクト間の順序は不定です。また、"ユニット" セマンティクスによっても、グローバル オブジェクト コンストラクタと #pragma startup/exit ルーチンの呼び出し順序が変わる可能性があります。(VCL や FMX などの)Object Pascal ユニットで宣言されているシンボルをコードで参照せず、グローバル オブジェクト コンストラクタの呼び出し順序にコードが依存しない(ほとんどの C++ コードは依存しません)場合は、おそらく "ユニット" セマンティクスは必要なく、[ファイル|新規作成|ユニット - C++]で生成される #pragma package(..) を削除できます。

関連項目