性格悪い人が優勝

新しい関数を使ったソースを古いOSでコンパイルすると、外部シンボル...Aが未解決になります。
ヘッダファイルでその関数のプロトタイプを書くとコンパイル可能になると思いますがヘッダファイルを使わずに*.cppにプロトタイプを書くようなことは可能ですか?
__declspec(import) DWORD Win7OnlyEx(LPTSTR);

A 回答 (3件)

プロトタイプ宣言をしたところで


リンク時の外部シンボルの未解決は直りませんよ。

プロトタイプ宣言は「こういう関数がありますよ」というだけで
その関数の実態があるかないかはまた別の話です。

プロトタイプ宣言で関数の実態まで勝手に作ってくれる
なんてことはありません。
    • good
    • 0

それよりも対象のOSで使えない関数は使わないとか、VC++なら_WIN32_WINNT や WINVERマクロを設定し、その値を見て処理を切り分けるとかにしたほうがいいように思えます。



また、例示の Win7OnlyEx の場合、

DWORD MyWin7OnlyEx(LPTSTR p)
{
#if defined(WINVER) && WINVER >= 0x601
 return Win7OnlyEx(p);
#else
 return 0; // あるいは何らかのエラー値を返す
#endif // defined(WINVER) && WINVER >= 0x601
}

とラップして、Win7OnlyEx の代わりにこの関数を呼び出すようにするという手があります。

参考URL:http://homepage1.nifty.com/herumi/prog/gcc-and-v …
    • good
    • 0

可能/不可能?だけを考えれば、ヘッダファイル(*.h)はソースファイル(*.c/*.cpp)にインクルードして使用するものですから、ソースファイルにその内容を直接記述することは可能です。

しかし、何故プロトタイプ宣言がヘッダーファイルに分離されているかを考えれば、プロトタイプ宣言をソースファイル内に書くことはやらないほうが賢明でしょう。

問題点(外部シンボルの未解決)に対して対策(プロトタイプ宣言のソースファイルへの記述)が正しくないように思われます。
コンパイラのバージョンによって処理を変更する場合、コンパイラの定義済みのマクロによって条件コンパイルを行うようにヘッダ/ソースファイルを記述すべきです。
たとえばVisuall C++ではコンパイラのバージョン番号として _MSC_VER が定義されているので、条件コンパイルに使用できます。
#if _MSC_VER < 1500 // VC++ 2005(?)以下
...(対象のバージョン以下のの記述)
#else
...(対象のバージョン以上のの記述)
#endif
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!