Hari ini saya harus menggunakan basename()
fungsi, dan man 3 basename
(di sini ) memberi saya beberapa pesan aneh:
Catatan
Ada dua versi basename () yang berbeda - versi POSIX yang dijelaskan di atas, dan versi GNU , yang diperoleh setelahnya
#define _GNU_SOURCE
#include <string.h>
Saya bertanya-tanya apa #define _GNU_SOURCE
artinya ini : apakah ini mencemari kode yang saya tulis dengan lisensi terkait GNU? Atau apakah itu hanya digunakan untuk memberi tahu kompiler sesuatu seperti " Yah, saya tahu, rangkaian fungsi ini bukan POSIX, jadi tidak portabel, tetapi saya tetap ingin menggunakannya ".
Jika demikian, mengapa tidak memberi orang header yang berbeda, daripada harus mendefinisikan beberapa makro yang tidak jelas untuk mendapatkan satu implementasi fungsi atau yang lainnya?
Sesuatu juga mengganggu saya: bagaimana kompiler mengetahui implementasi fungsi mana yang harus dihubungkan dengan yang dapat dieksekusi? Apakah ini menggunakan ini #define
juga?
Adakah yang punya beberapa petunjuk untuk memberi saya?
_GNU_SOURCE
adalah untuk mendapatkanstrfry
danmemfrob
.#define _GNU_SOURCE
Direkomendasikan untuk menjadi "hal pertama dalam file, didahului hanya dengan komentar")._FILE_OFFSET_BITS
, tidak_GNU_SOURCE
.Biarkan saya menjawab dua poin lebih lanjut:
Pendekatan umum adalah
#define
mengidentifikasi secara kondisionalbasename
untuk nama yang berbeda, tergantung pada apakah_GNU_SOURCE
didefinisikan. Misalnya:Sekarang perpustakaan hanya perlu menyediakan kedua perilaku di bawah nama-nama itu.
Seringkali header yang sama memiliki konten yang sedikit berbeda di versi Unix yang berbeda, jadi tidak ada konten yang tepat untuk, katakanlah,
<string.h>
- ada banyak standar ( xkcd ). Ada satu set makro untuk memilih yang favorit Anda, sehingga jika program Anda mengharapkan satu standar, perpustakaan akan sesuai dengan itu.sumber
Untuk perincian yang pasti tentang semua yang diaktifkan
_GNU_SOURCE
, dokumentasi dapat membantu.Dari dokumentasi GNU:
Dari halaman manual Linux pada makro uji fitur :
Catatan :
_GNU_SOURCE
perlu ditentukan sebelum termasuk file header sehingga header masing-masing mengaktifkan fitur. Sebagai contoh:_GNU_SOURCE
dapat juga diaktifkan per kompilasi menggunakan-D
flag:(
-D
tidak spesifik untuk_GNU_SOURCE
tetapi makro didefinisikan dengan cara ini).sumber
Dari beberapa milis via google:
Jadi itu memungkinkan banyak kompilasi flag untuk gcc
sumber