2017-10-01 2 views
-3

Hallo ich bin neu in C++ und ich möchte ein Programm schreiben, das mir verschiedene Funktionen testet, die darin definiert sind, wenn es kompiliert und ausgeführt wird .C++ Schreiben einer Cosol-Anwendung, von der aus man Funktionen aufrufen kann self

Ich könnte eine einfache switch, die den Fall von einer cin erhält, aber dann würde ich für jede Funktion ich schreiben müssen, und ich bin mir nicht sicher, wie man die Argumente durch das (wie ich sagte ich bin neu)

ich von Haskell in wich kommen Sie gerade anrufen können, was auch immer Sie mit Funktion custome Parameter wie ... (macht Fälle Testkante und Single ‚Parts‘ einfach)

Wie würde ich das tun in C++?

Thx

+2

Ein gutes Buch für Anfänger ist die Antwort. – DeiDei

+0

Ich möchte nur einen Weg, um meine Funktionen mit verschiedenen Kasus zu testen, ohne jedes Mal kompilieren – Tom507

+1

C++ ist eine kompilierte Sprache, es gibt keine Möglichkeit, es ohne Kompilierung auszuführen. Wie beim Testen gibt es spezielle Komponententestsuiten, mit denen Sie nur erforderliche Teile bei Bedarf ausführen können, z. B. Microsoft Unit Testing Framework für C++ oder Boost.Test. – VTT

Antwort

0

Ein möglicher Ansatz sein könnte, will schreiben zu einige einbetten Interpreter (wie Lua, Guile, etc ...) in Ihrer C++ - Anwendung. Dann würde Ihr fortgeschrittener Benutzer ein Skript in dieser Sprache programmieren und kann jede Routine, in die Sie eingebettet sind, aufrufen (d. H. Mit dem Interpreter verbunden oder geklebt werden).

(alternativ Ihren eigenen Dolmetscher schreiben, aber das ist viel mehr Arbeit)

Ein weiterer Ansatz könnte sein, dynamic loading Einrichtungen zu nutzen, aber diese sind betriebssystemspezifisch. Unter Linux (und POSIX) würden Sie dlopen(3) und dlsym(3) verwenden. Achten Sie auf name mangling, verwenden Sie daher extern "C" für die C++ - Funktionen, die Sie zur Laufzeit mit dlsym laden möchten (siehe C++ dlopen mini howto).

könnte eine Variante (mit C++ Code) dynamisch einigen C++ Quelle in einer temporären Datei zu erzeugen sein (vielleicht von einigen Benutzereingaben, einige Zwischen AST wollen), fork eine Zusammenstellung des Codes in eine temporäre plugin und dynamisch, dass dlopen mit laden, führen Sie es (mit dlsym erhaltene rohe Funktionszeiger verwenden)

aber (im Gegensatz zu Haskell oder Scheme oder Ocaml) gibt es keine REPL in C++, so dass Sie einen vornehmen müssen (die Tricks Ich dachte oben), wenn Sie einige wollen, und das ist eine schwierige Aufgabe für einen C++ - Neuling. C++ ist praktisch eine Programmiersprache, die kompiliert werden sollte (praktisch mit einer compiler wie GCC oder Clang gestartet von einigen build automation Werkzeug wie GNU make oder ninja). Und C++ ist eine sehr komplexe Sprache, schwer zu lernen und zu kompilieren, so dass alle Compiler sind eher langsam.

BTW, sicher sein, mindestens C++ 11 zu lernen.

Vielleicht möchten Sie einige unit testing. Es gibt Tools und Bibliotheken auf, dass zu helfen (siehe this answer, und auch that list)

Ich könnte einen einfachen Schalter tun, die den Fall von einem

cin recieves

Sie sollten mehr fancy stuff betrachten. Zum Beispiel könnten Sie mindestens einige std::map mit std::string -s Schlüssel und Werte von einigen gemeinsamenstd::function Typ dann verwenden Sie lambda expressions, um es zu füllen.

Sie könnten die neuesten Dragon Book lesen; Es ist hilfreich, Techniken zu analysieren, zu interpretieren und zu kompilieren (und sie sind für Ihren Wunsch relevanter als das, was Sie sich vorstellen könnten).

Lesen Sie auch (frei herunterladbare Einführung in die Programmierung, mit Scheme); Es geht nicht um C++, aber es wird Ihnen helfen, Haskell mit C++ zu verbinden, und Sie werden Ihr Denken über die Programmierung verbessern.

+0

nein Ich möchte lernen, C++ nicht lua oder etwas anderes und diese Frage ruiniert nur meine kleine rep so groß, aber thx immer noch – Tom507

+0

Sie müssen auch lernen, Programmierung (und nicht nur C++ Syntax); Einen nützlichen Einblick finden Sie unter http://norvig.com/21-days.html. –

+0

Vielen Dank für Ihre unglaublich komplizierte und lange Antwort Ich fürchte, ich werde nicht in der Lage sein, dies mit meinem Fähigkeitsniveau zu versuchen, aber ich möchte C++ nicht wirklich dazu zwingen, sich so zu benehmen, ich habe es einfach gemacht false asumtion, dass ich in der Lage wäre, es ähnlich wie haskell zu erreichen, das ist Dumm – Tom507

0

Die richtige Antwort für mich wäre:

Ich kann es nicht tun, weil die Namen der Funktionen mehr nicht sogar exsist. Nach dem Kompilieren bleibt nur noch ihre Logik mit allen notwendigen Informationen erhalten.

-> so können Sie keine Funktionen in kompilierten Code durch ihre Namen nennen, es sei denn Sie

thx Ihre eigenen User Interface/keyword-Interpreter

+0

Die Tatsache, dass C++ Funktionsnamen verschwunden sind zur Laufzeit sollten Sie nicht verbieten, einige Namen * explizit * in Ihrem Programm zu speichern (siehe Erwähnung von 'std :: map' in meiner Antwort). Natürlich sind Ihre Namen * a priori * unabhängig von denen, die der C++ Compiler verarbeitet. –

Verwandte Themen