Apa artinya -D_XOPEN_SOURCE?

103

Baru-baru ini saya menemukan beberapa kode yang tidak dapat dikompilasi oleh gcc tanpa argumen ini. Saya telah memeriksa halaman manual gcc, tetapi tidak menemukan opsi khusus ini. Saya memang menemukan XOPEN_SOURCE, tetapi ada sedikit penjelasan tentang apa yang dilakukannya.

Bisakah seseorang menjelaskan lebih lanjut? Aku tahu -D_XOPEN_SOURCEdapat diatur untuk nilai yang berbeda, seperti 400, 600, tapi apa yang do mereka?

anio
sumber

Jawaban:

132

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 strdupkata:

   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 #includejika 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, #defineatau menggunakan fungsi baru, karena kadang-kadang perilaku mereka berubah tergantung pada apa pilihan dan #defines Anda memiliki, misalnya dengan basename (3) .

Lihat juga:

Mikel
sumber
4
Hanya komentar untuk menggarisbawahi betapa pentingnya "di bagian atas file sumber Anda" untuk definisi dialek bahasa ini. Jika mereka tidak berada di puncak, mereka tidak akan bekerja.
Dr. Orang Orang II
6

-Dadalah 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_SOURCEatau 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.

davrieb
sumber
3

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.

Aif
sumber
1

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 ...

jesup
sumber