Cosa significa -D_XOPEN_SOURCE?


103

Recentemente ho riscontrato del codice che gcc non compilerebbe senza questo arg. Ho controllato la pagina man di gcc, ma non ho trovato questa opzione specifica. Ho trovato XOPEN_SOURCE, ma c'era poca spiegazione di quello che fa.

Qualcuno può elaborare per favore? So che -D_XOPEN_SOURCEpuò essere impostato su valori diversi, come ad esempio 400, 600ma quello che fanno quelli fai?

Risposte:


132

Quando lo fai

#define _XOPEN_SOURCE <some number>

o

cc -D_XOPEN_SOURCE=<some number>

dice al compilatore di includere definizioni per alcune funzioni extra definite negli standard X / Open e POSIX.

Questo ti darà alcune funzionalità extra che esistono sui più recenti sistemi UNIX / BSD / Linux, ma probabilmente non esistono su altri sistemi come Windows.

I numeri si riferiscono a diverse versioni dello standard.

Puoi dire quale ti serve (se esiste) guardando la pagina man per ogni funzione che chiami.

Ad esempio, man strdupdice:

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

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

Ciò significa che dovresti mettere uno di questi:

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

all'inizio del file sorgente prima di eseguire qualsiasi #includes se si desidera utilizzare strdup.

Oppure potresti mettere

#define _GNU_SOURCE

lì invece, che abilita tutte le funzionalità, con il rovescio della medaglia che potrebbe non essere compilabile su Solaris, FreeBSD, Mac OS X, ecc.

È una buona idea controllare ogni pagina di manuale prima di fare un #include, #defineo usare una nuova funzione, perché a volte il loro comportamento cambia a seconda delle opzioni e dei messaggi di posta #defineelettronica che hai, ad esempio con basename (3) .

Guarda anche:


4
Solo un commento per sottolineare quanto sia importante "all'inizio del file sorgente" per queste definizioni del dialetto linguistico. Se non sono al top, non funzionano.
Dr. Person Person II

6

-Dè un'opzione del compilatore ac per definire una variabile del preprocessore. In questo caso _XOPEN_SOURCE.

Ciò non influisce effettivamente sul comportamento del compilatore stesso, ma piuttosto cambia il modo in cui si comportano alcune librerie, ad esempio la libreria c standard. Ci sono diverse opzioni come questa. Nella maggior parte dei casi sono in relazione ad alcuni documenti standard su alcune interfacce di programmazione specifiche per UNIX, o su alcuni fornitori di librerie specifiche.

A volte è necessario definirne una, perché il comportamento di alcune funzioni standard o anche la loro firma può differire tra gli standard. Quindi potresti dover usare -D_XOPEN_SOURCEo qualcosa di simile per attivare una modalità di compatibilità.

Un altro possibile utilizzo di questi flag è assicurarsi che il codice sorgente rimanga entro i limiti di un certo standard, attivando le estensioni offerte dall'implementazione della libreria C. Questa è una delle misure che potresti utilizzare per assicurarti che il tuo codice venga eseguito su quante più piattaforme possibile.


3

Questo espone l'intestazione ad appartenere a una definizione di una data norma, come posix. La norma effettiva a cui appartiene è definita dal valore (qui 400 o 600 per esempio). Vedere questo riferimento per l'associazione norma / valore.


1

Per qualche motivo sconosciuto, Mac OS / X (XCode) richiede 600 per definire strdup (), anche se è nella specifica del 1995. Mozilla e altri si sono imbattuti in questo ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.