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_SIZE
dikenal 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_DIR
variabel, bukan CMAKE_SOURCE_DIR
.