Saat kamu melakukan
#define _XOPEN_SOURCE <some number>
atau
cc -D_XOPEN_SOURCE=<some number>
ia memberitahu kompiler Anda untuk menyertakan definisi untuk beberapa fungsi tambahan yang didefinisikan dalam standar X / Open dan POSIX.
Ini akan memberi Anda beberapa fungsionalitas tambahan yang ada di sistem UNIX / BSD / Linux terbaru, tetapi mungkin tidak ada di sistem lain seperti Windows.
Angka-angka tersebut mengacu pada berbagai versi standar.
Anda dapat mengetahui mana yang Anda butuhkan (jika ada) dengan melihat halaman manual untuk setiap fungsi yang Anda panggil.
Misalnya, man strdup
kata:
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
strndup(), strdupa(), strndupa(): _GNU_SOURCE
Yang berarti Anda harus meletakkan salah satu dari ini:
#define _SVID_SOURCE
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700
di bagian atas file sumber Anda sebelum melakukan apapun #include
jika Anda ingin menggunakan strdup
.
Atau Anda bisa meletakkan
#define _GNU_SOURCE
sebagai gantinya, yang mengaktifkan semua fungsionalitas, dengan sisi negatifnya mungkin tidak dapat dikompilasi di Solaris, FreeBSD, Mac OS X, dll.
Ini adalah ide yang baik untuk memeriksa setiap halaman manual sebelum melakukan #include
, #define
atau menggunakan fungsi baru, karena kadang-kadang perilaku mereka berubah tergantung pada apa pilihan dan #define
s Anda memiliki, misalnya dengan basename (3) .
Lihat juga:
-D
adalah opsi compiler ac untuk mendefinisikan variabel preprocessor. Dalam kasus ini_XOPEN_SOURCE
.Ini sebenarnya tidak mempengaruhi perilaku kompilator itu sendiri, melainkan mengubah bagaimana beberapa perpustakaan, misalnya perpustakaan c standar, berperilaku. Ada beberapa opsi seperti ini. Dalam kebanyakan kasus, mereka terkait dengan beberapa dokumen standar tentang beberapa antarmuka pemrograman khusus UNIX, atau beberapa vendor perpustakaan tertentu.
Mendefinisikan salah satunya terkadang diperlukan, karena perilaku beberapa fungsi standar atau bahkan tanda tangannya dapat berbeda antar standar. Jadi, Anda mungkin harus menggunakan
-D_XOPEN_SOURCE
atau sesuatu yang serupa untuk mengaktifkan mode kompatibilitas.Penggunaan lain yang mungkin dari tanda ini adalah memastikan kode sumber Anda tetap dalam batas standar tertentu, dengan mengubah ekstensi yang ditawarkan oleh implementasi pustaka C Anda. Ini adalah salah satu ukuran yang dapat Anda gunakan untuk memastikan bahwa kode Anda berjalan di sebanyak mungkin platform.
sumber
Ini memperlihatkan header milik definisi dari norma tertentu, seperti posix. Norma sebenarnya yang dimilikinya ditentukan oleh nilai (di sini 400 atau 600 misalnya). Lihat Referensi ini untuk pengikatan norma / nilai.
sumber
Untuk beberapa alasan yang tidak diketahui, Mac OS / X (XCode) membutuhkan 600 untuk mendefinisikan strdup (), meskipun itu dalam spesifikasi 1995. Mozilla dan yang lainnya mengalami ini ...
sumber