環境は Microsoft Visual C++ 2015 と Windows 7 です。
inline extern "C"
ヘッダーで定義された関数について何か特別なことはありますか? ヘッダーの 1 つにそのような獣が含まれている SDK を使用しています。私のアプリケーションには、前述のヘッダーを含めることだけが唯一の仕事である TU (翻訳単位) があります。それで全部です。他には何も入っていません。生成されたオブジェクト ファイルを掘り下げると、extern "C"
関数が取り込まれていることがわかります。これにより、いくつかの望ましくない副作用が発生しています (主な問題から気をそらす可能性があるため、現時点では省略します)。
なぜこれが起こるのでしょうか?main()
クライアント コードからは何も発生していません (エントリ ポイントとそのヘッダーを除いて、私の唯一の TU は空であることを思い出してください)。
私が遭遇していることをよりよく説明するかもしれない小さなスニペットで更新してください:
これが実際に起こっていることです:
FooObj.h
FooObj::FooObj() { }
FooObj::~FooObj() { CallIntoAnotherC_API(); }
SDKHeader.h
#include <FooObj.h>
extern "C" inline void SomeFunc(void* user_data)
{
A* obj = static_cast<A*>(user_data);
obj->CallAnotherFunc(FooObj(33));
}
MyFile.cpp
#include "SDKHeader.h"
int main() { return 0; }
MyFile.cpp を実行可能ファイルにコンパイルすると、リンカーが CallIntoAnotherC_API が未解決の外部であると不平を言って失敗します。