ヘッダーでインライン関数を定義する共有ライブラリを使用しています。
これは、ライブラリにリンクしているコンパイルユニットから見た、縮小されたテストケースです(ライブラリから見たバージョンの場合は、に置き換えdllimport
てdllexport
ください)。
class __declspec(dllimport) MyClass {
public:
int myFunc2();
int myFunc1();
};
inline int MyClass::myFunc2(void) {
return myFunc1();
}
inline int MyClass::myFunc1(void) {
return 0;
}
これをコンパイルすると、警告が表示されます。
警告:'int MyClass :: myFunc1()' dllリンケージで参照された後、dllimport属性なしで再宣言されました[デフォルトで有効]
myFunc1
結果の定義の前にの定義を置くと警告が表示されないため、関数が定義される順序が重要であることに注意してくださいmyFunc2
。
このコードは、VisualC++では警告なしにコンパイルされることにも注意してください。これらの警告は、少なくともMinGWに固有のものであり、おそらくGCC全般に固有のものです。編集:プロジェクトによって設定されたフラグの1つによって警告が抑制されていないかどうかを確認する必要があるかもしれないことに気づきました。
私の質問は次のとおりです。
- なぜこの振る舞い?
- クラス宣言内で宣言すると、問題が修正
myFunc1
されます。inline
何故ですか ?また、推奨される方法にも反します。 - この問題を解決する別の(より良い?)方法はありますか?