Saya baru saja memikirkan solusi hebat untuk ini yang bekerja dengan kedua sumber dan file header, sangat efisien dan bekerja pada waktu kompilasi di semua platform tanpa ekstensi spesifik kompiler. Solusi ini juga mempertahankan struktur direktori relatif dari proyek Anda, sehingga Anda tahu di folder mana file itu berada, dan hanya relatif terhadap akar proyek Anda.
Idenya adalah untuk mendapatkan ukuran direktori sumber dengan alat build Anda dan tambahkan saja ke __FILE__ makro, menghapus direktori sepenuhnya dan hanya menampilkan nama file mulai dari direktori sumber Anda.
Contoh berikut diimplementasikan menggunakan CMake, tetapi tidak ada alasan itu tidak akan bekerja dengan alat build lain, karena triknya sangat sederhana.
Pada file CMakeLists.txt, tentukan makro yang memiliki panjang jalur ke proyek Anda di 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}")
Pada kode sumber Anda, tentukan __FILENAME__makro yang hanya menambahkan ukuran jalur sumber ke __FILE__makro:
#define __FILENAME__ (__FILE__ + SOURCE_PATH_SIZE)
Kemudian gunakan makro baru ini bukan __FILE__makro. Ini berfungsi karena __FILE__path akan selalu dimulai dengan path ke dir sumber CMake Anda. Dengan menghapusnya dari __FILE__string, preprocessor akan menentukan nama file yang benar dan itu semua akan relatif terhadap akar proyek CMake Anda.
Jika Anda peduli dengan kinerja, ini seefisien menggunakan __FILE__ , karena keduanya __FILE__dan SOURCE_PATH_SIZEdikenal sebagai konstanta waktu kompilasi, sehingga dapat dioptimalkan oleh kompiler.
Satu-satunya tempat di mana ini akan gagal adalah jika Anda menggunakan ini pada file yang dihasilkan dan mereka berada di folder build off-source. Maka Anda mungkin harus membuat makro lain menggunakan CMAKE_BUILD_DIRvariabel, bukan CMAKE_SOURCE_DIR.