Wie extrahieren Sie die Quell-Dateiname ohne Pfad und suffix zur compile-Zeit?

Sowohl mithilfe von gcc mit -std=c11-und g++ - mit -std=c++14.

E. g. für eine Datei mit dem Namen src/dir/Hello.cxx es sollte zu erweitern, um so etwas wie z.B.:

const char basename[] = "Hello";

oder

const char basename[] = getStaticBasename(__FILE__);

da, wo getStaticBasename() ist ein makro (für C-Quellen) oder constexpr-Funktion (für C++ - Quellen) die Ergebnisse zu "Hallo".

Habe ich, um zu vermeiden Aufspaltung der string aus __FILE__ zur Laufzeit, da der Pfad und suffix muss nicht kompiliert werden, in die ausführbare Datei in keiner Weise.

Muss die Lösung sein, ohne Abhängigkeiten zu riesigen Bibliotheken wie boost.

Da ich keine makefiles, Lösungen wie diese nicht verwendet werden, in meinem Fall.

Hatte man eine Lösung für das?

Bearbeiten 2015-07-02:

  • Ich habe keinen Einfluss darauf, wie der compiler und linker aufgerufen wurde (manchmal über makefile, mal von der Kommandozeile, oder einige IDE (Eclipse CDT managed machen, Crossworks, Xcode et cetera. Also die Lösung muss im code nur.
  • Mein use-case ist eine Art "generic region identifier" für eine kleine Stellfläche logging-Lösung. Den code der Anwendung (die nutzt mein logger) sollte nur #include <Joe/Logger.h> und in den später ruft z.B. LOG_DEBUG(...) ich werde implizit nutzen, die automatisch generierte "generic region identifier".
  • Meine aktuelle Lösung ist, dass der code der Anwendung zu deklarieren einer JOE_LOG_FILE_REGION(Hello); (nach #include <Joe/Logger.h>) vor Ort LOG_DEBUG(...) im code.
  • C++ ist ziemlich einfach. Ich kann nicht glauben, wie es gemacht werden würde in C.
  • Ich denke es ist am besten aufteilen, diese Frage in zwei, wie c++ Aussehen kann sehr unterschiedlich aufgrund der Möglichkeit der Verwendung von constexprs.
  • Die Frage ist nicht doppelt vorhanden, weil Sie es wollen zur compile-Zeit, aber eine Antwort gibt es, was Sie brauchen: __FILE__ makro zeigt vollständigen Pfad
  • Warum gehst du nicht fügen Sie Ihrem C++ - Lösung als Antwort, oder zumindest geben einige Hinweise? Ja, es antwortet nicht der C-Teil, aber es ist immer noch besser als nichts.
  • Ich fürchte, mir fehlt die Zeit (und vielleicht die smarts) zusammenbringen, aber hier ist eine Umsetzung durch jemand anderes bietet die schwieriger bits (substr): "github.com/dscharrer/void/blob/master/c%2B%2B/...
  • Die makefile Lösung angepasst werden kann, um die Befehlszeile. Nur haben einige-Skript zu bauen, Ihre Sache, oder sogar die Verwendung von einem Skript anstatt der g++
  • Ich brauche eine Lösung, die unabhängig ist, wie der compiler aufgerufen wird.
  • Yep, ich denke, ich werde es aufgeteilt in zwei Fragen, die für C und C++

InformationsquelleAutor Joe | 2015-06-25
Schreibe einen Kommentar