-D_XOPEN_SOURCE ne anlama geliyor / ne anlama geliyor?


104

Geçenlerde gcc'nin bu arg olmadan derleyemeyeceği bir kodla karşılaştım. Gcc man sayfasını kontrol ettim, ancak bu belirli seçeneği bulamadım. Buldum XOPEN_SOURCEama ne yaptığına dair çok az açıklama vardı.

Biri lütfen ayrıntılandırabilir mi? Ben biliyorum -D_XOPEN_SOURCEfarklı değerlere, böyle ayarlanabilir 400, 600bu do ne ama?

Yanıtlar:


132

Ne zaman yaparsan

#define _XOPEN_SOURCE <some number>

veya

cc -D_XOPEN_SOURCE=<some number>

derleyicinize X / Open ve POSIX standartlarında tanımlanan bazı ekstra işlevler için tanımları eklemesini söyler.

Bu size en yeni UNIX / BSD / Linux sistemlerinde var olan, ancak muhtemelen Windows gibi diğer sistemlerde bulunmayan bazı ekstra işlevler sağlayacaktır.

Numaralar, standardın farklı versiyonlarına atıfta bulunmaktadır.

Aradığınız her işlev için man sayfasına bakarak (varsa) hangisine ihtiyacınız olduğunu anlayabilirsiniz.

Örneğin man strdupşöyle diyor:

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
       strndup(), strdupa(), strndupa(): _GNU_SOURCE

Bu, şunlardan birini koymanız gerektiği anlamına gelir:

#define _SVID_SOURCE
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700

#includekullanmak istiyorsanız herhangi bir işlem yapmadan önce kaynak dosyanızın en üstünde strdup.

Veya koyabilirsin

#define _GNU_SOURCE

bunun yerine, Solaris, FreeBSD, Mac OS X, vb. üzerinde derlenememesinin dezavantajı ile tüm işlevleri etkinleştirir

Bir yapmadan önce her erkek sayfasını kontrol etmek iyi bir fikirdir #include, #definebazen onların davranışları nasıl seçeneklere bağlı olarak değişir ve çünkü, ya da yeni bir fonksiyonu kullanarak #defineörneğin, sahip s basename (3) .

Ayrıca bakınız:


4
Bu dil-lehçe tanımları için "kaynak dosyanızın en üstünde" nin ne kadar önemli olduğunun altını çizmek için sadece bir yorum. En tepede değillerse çalışmıyorlar.
Dr. Şahıs Kişi II

6

-Dbir önişlemci değişkenini tanımlamak için bir ac derleyici seçeneğidir. Bu durumda _XOPEN_SOURCE.

Bu aslında derleyicinin davranışını etkilemez, bunun yerine bazı kitaplıkların, örneğin standart c kitaplığının davranışını değiştirir. Bunun gibi birkaç seçenek var. Çoğu durumda, UNIX'e özgü bazı programlama arabirimleri veya belirli bir kitaplık satıcısı hakkındaki bazı standart belgelerle ilişkilidir.

Bunlardan birini tanımlamak bazen gereklidir, çünkü bazı standart işlevlerin davranışı ve hatta imzaları standartlar arasında farklılık gösterebilir. Dolayısıyla -D_XOPEN_SOURCE, bir uyumluluk modunu açmak için kullanmanız veya buna benzer bir şey yapmanız gerekebilir .

Bu bayrakların bir başka olası kullanımı, C kütüphanesi uygulamanız tarafından sunulan uzantıları çevirerek kaynak kodunuzun belirli bir standart sınırları içinde kalmasını sağlamaktır. Bu, kodunuzun mümkün olduğunca çok platformda çalıştığından emin olmak için kullanabileceğiniz önlemlerden biridir.


3

Bu, başlığın posix gibi belirli bir norm tanımına ait olduğunu gösterir. Ait olduğu gerçek norm değerle tanımlanır (burada örneğin 400 veya 600). Norm / değer bağlaması için bu Referansa bakın .


1

Bilinmeyen bir nedenden ötürü, Mac OS / X (XCode), 1995 spesifikasyonunda olmasına rağmen strdup () öğesini tanımlamak için 600 gerektirir. Mozilla ve diğerleri bununla karşılaştı ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.