3

CファイルとC++ファイルの両方を使用するアプリケーションをコンパイルする方法を理解しようとしています。コード全体ではありませんが、アイデアを得るには十分です。

main.cpp:

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include "one.h"
#include "two.h"

int __stdcall WinMain(HINSTANCE hInst, HINSTANCE hInst2, LPSTR lpCmdLine, int nShowCmd) {
    FunctionOne();
    FunctionTwo();
}

one.cpp:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <gdiplus.h>
#include <gdiplusflat.h>
using namespace Gdiplus;
using namespace Gdiplus::DllExports;

int FunctionOne() {
}

two.c

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int FunctionTwo() {
}

ヘッダーファイルには、これらの関数の定義のみが含まれています。

これをmain.cppでコンパイルすると、FunctionTwoの「未解決の外部シンボル」が表示されます。これをmain.cでコンパイルすると、FunctionOneでも同じことがわかります。これも可能ですか?もしそうなら、プロジェクトを正しくコンパイルするように設定するにはどうすればよいですか(Visual Studio 2010)?

mainの拡張子に応じて代替関数をコメントアウトすると、正常にコンパイルされます。

ありがとう!

4

2 に答える 2

10

問題はtwo.h、C++コンパイラがC関数プロトタイプを適切にコンパイルできるように作成されていないことはほぼ間違いありません。次のように、事前定義された__cplusplusマクロを利用することをお勧めします。

two.h:

#ifdef __cplusplus
extern "C" {
#endif

int FunctionTwo();
// etc...

#ifdef __cplusplus
}
#endif

素敵なマクロスープ;)ヘッダーがプリベイクされていて、それまでC ++コンパイラを見たことがない場合は、.cppソースコードファイルでこれを実行します。

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include "one.h"
extern "C" {
#include "two.h"
}

一部のプログラマーは、ヘッダーファイルにC ++宣言が含まれている場合は.hpp、C宣言が含まれている場合は.hという名前を付けます。それは私が個人的に好むかなり良い習慣です。Boostチームもそうです。それ以外の場合、世界に火をつけることはありませんでした。

于 2012-09-27T21:30:42.053 に答える
0

C ++は名前マングリングを実行して関数のオーバーロードをサポートしますが、Cはサポートしません。extern "C"名前のマングリングを防ぐために、関数にマークを付ける必要があります。

// main.cpp

extern "C" int FunctionTwo();

.. the rest ..

// two.c

extern "C" int FunctionTwo() {
    // stuff
}

CとC++の混合の詳細については、 http://www.parashift.com/c++-faq/mixing-c-and-cpp.htmlを参照してください。

于 2012-09-27T21:25:44.477 に答える