Ich habe gerade an eine großartige Lösung gedacht, die sowohl mit Quell- als auch mit Header-Dateien funktioniert, sehr effizient ist und die Kompilierungszeit auf allen Plattformen ohne compilerspezifische Erweiterungen unterstützt. Diese Lösung behält auch die relative Verzeichnisstruktur Ihres Projekts bei, sodass Sie wissen, in welchem Ordner sich die Datei befindet und nur relativ zum Stammverzeichnis Ihres Projekts.
Die Idee ist, die Größe des Quellverzeichnisses mit Ihrem Build-Tool zu ermitteln und es einfach dem __FILE__
Makro hinzuzufügen , das Verzeichnis vollständig zu entfernen und nur den Dateinamen anzuzeigen, der in Ihrem Quellverzeichnis beginnt.
Das folgende Beispiel wird mit CMake implementiert, aber es gibt keinen Grund, warum es mit anderen Build-Tools nicht funktionieren würde, da der Trick sehr einfach ist.
Definieren Sie in der Datei CMakeLists.txt ein Makro mit der Länge des Pfads zu Ihrem Projekt in CMake:
# The additional / is important to remove the last character from the path.
# Note that it does not matter if the OS uses / or \, because we are only
# saving the path size.
string(LENGTH "${CMAKE_SOURCE_DIR}/" SOURCE_PATH_SIZE)
add_definitions("-DSOURCE_PATH_SIZE=${SOURCE_PATH_SIZE}")
Definieren Sie in Ihrem Quellcode ein __FILENAME__
Makro, das dem Makro nur die Quellpfadgröße hinzufügt __FILE__
:
#define __FILENAME__ (__FILE__ + SOURCE_PATH_SIZE)
Verwenden Sie dann einfach dieses neue Makro anstelle des __FILE__
Makros. Dies funktioniert, da der __FILE__
Pfad immer mit dem Pfad zu Ihrem CMake-Quellverzeichnis beginnt. Durch Entfernen aus der __FILE__
Zeichenfolge übernimmt der Präprozessor die Angabe des richtigen Dateinamens und alles relativ zum Stammverzeichnis Ihres CMake-Projekts.
Wenn Sie sich für die Leistung interessieren, ist dies genauso effizient wie die Verwendung __FILE__
, da beide __FILE__
und SOURCE_PATH_SIZE
bekannte Kompilierungszeitkonstanten bekannt sind, sodass sie vom Compiler optimiert werden können.
Der einzige Ort, an dem dies fehlschlagen würde, ist, wenn Sie dies für generierte Dateien verwenden und diese sich in einem Off-Source-Build-Ordner befinden. Dann müssen Sie wahrscheinlich ein anderes Makro mit der CMAKE_BUILD_DIR
Variablen anstelle von erstellen CMAKE_SOURCE_DIR
.