Mit .c und .cpp-Dateien in Visual Studio zur gleichen Zeit
Versuchen, herauszufinden, wie man eine Anwendung zu kompilieren, verwendet die C-und C++ - Dateien. Nicht der gesamte code, aber genug, um die Idee kommen:
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() {
}
zwei.c
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int FunctionTwo() {
}
Den header-Dateien enthalten Definitionen für diese Funktionen.
Nun, wenn ich zum Beispiel dieses mit einem main.cpp, bekomme ich ein "nicht aufgelöstes externes symbol" für FunctionTwo. Wenn ich zum Beispiel dieses mit einem main.c, bekomme ich die gleiche Sache für FunctionOne. Ist das überhaupt möglich, und wenn ja, wie würde ich es einrichten, das Projekt zu kompilieren, richtig (Visual Studio 2010)?
Kompiliert er fein, wenn ich kommentieren Sie die alternate-Funktion je nach der Erweiterung für main.
Dank!
- Dies sehen -> stackoverflow.com/questions/12573816/... - MSVS kompiliert
.c
Dateien als C und.cpp
- Dateien als C++.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist
two.h
es fast sicher nicht geschrieben worden, um zu erlauben, einen C++ - compiler zum kompilieren der C-Funktion Prototyp. Sie wollen, um die Vorteile der vordefinierten __cplusplus makro, so wie hier:zwei.h:
Schöne makro-Suppe 😉 Wenn der header vorgebacken, und sah nie einen C++ - compiler, bevor dann tun Sie dies in Ihrer .cpp-Quellcode-Datei:
Einige Programmierer, die Namen der header-Dateien .hpp, wenn Sie enthalten C++ - Deklarationen und .h wenn Sie enthalten C-Deklarationen. Das ist ein ziemlich guter Praxis, die ich persönlich bevorzugen. So funktioniert der Boost-team. Es hat nicht sonst setzen die Welt in Brand.
C++ bietet name-mangling zu unterstützen das überladen von Funktionen, während der C nicht. Markieren Sie Ihre Funktion als
extern "C"
um zu verhindern, dass die name manglings.Sehen http://www.parashift.com/c++-faq/mixing-c-and-cpp.html weitere Informationen über das mischen von C und C++.
FunctionTwo
?FunctionOne
kompiliert wie C++, nicht?