O que -D_XOPEN_SOURCE significa /?

103

Recentemente encontrei um código que o gcc não compilaria sem este arg. Verifiquei a página de manual do gcc, mas não encontrei essa opção específica. Eu encontrei XOPEN_SOURCE, mas havia pouca explicação do que ele faz.

Alguém pode explicar? Eu sei que -D_XOPEN_SOURCEpode ser definida com valores diferentes, como 400, 600, mas o que fazer essas tarefas?

anio
fonte

Respostas:

132

Quando você faz

#define _XOPEN_SOURCE <some number>

ou

cc -D_XOPEN_SOURCE=<some number>

ele diz ao seu compilador para incluir definições para algumas funções extras que são definidas nos padrões X / Open e POSIX.

Isso lhe dará algumas funcionalidades extras que existem nos sistemas UNIX / BSD / Linux mais recentes, mas provavelmente não existe em outros sistemas como o Windows.

Os números referem-se a diferentes versões do padrão.

Você pode dizer qual você precisa (se houver) olhando a página do manual para cada função que você chamar.

Por exemplo, man strdupdiz:

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

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

O que significa que você deve colocar um destes:

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

na parte superior do seu arquivo de origem antes de fazer qualquer #includes, se desejar usar strdup.

Ou você poderia colocar

#define _GNU_SOURCE

em vez disso, o que ativa todas as funcionalidades, com a desvantagem de que pode não ser compilado no Solaris, FreeBSD, Mac OS X, etc.

É uma boa idéia verificar cada página de manual antes de fazer um #include, #defineou usar uma nova função, porque às vezes o comportamento deles muda dependendo das opções e opções que #definevocê tem, por exemplo, com basename (3) .

Veja também:

Mikel
fonte
4
Apenas um comentário para sublinhar o quão importante é "no topo do seu arquivo de origem" para essas definições de dialeto de linguagem. Se não estiverem no topo, não funcionam.
Dr. Pessoa Pessoa II
6

-Dé uma opção do compilador ac para definir uma variável de pré-processador. Neste caso _XOPEN_SOURCE.

Na verdade, isso não afeta o comportamento do compilador em si, mas muda como algumas bibliotecas, por exemplo, a biblioteca c padrão, se comportam. Existem várias opções como esta. Na maioria dos casos, eles estão relacionados a algum documento padrão sobre alguma interface de programação específica do UNIX ou algum fornecedor de biblioteca específico.

Definir um deles às vezes é necessário, porque o comportamento de algumas funções padrão ou mesmo sua assinatura pode diferir entre os padrões. Portanto, pode ser necessário usar -D_XOPEN_SOURCEou algo semelhante para ativar o modo de compatibilidade.

Outro uso possível desses sinalizadores é garantir que seu código-fonte permaneça dentro dos limites de um determinado padrão, ativando as extensões oferecidas pela implementação de sua biblioteca C. Esta é uma das medidas que você pode usar para garantir que seu código seja executado no maior número de plataformas possível.

Davrieb
fonte
3

Isso expõe o cabeçalho a pertencer a uma definição de uma determinada norma, como posix. A norma real a que pertence é definida pelo valor (aqui 400 ou 600 por exemplo). Consulte esta referência para a vinculação de norma / valor.

Aif
fonte
1

Por alguma razão desconhecida, o Mac OS / X (XCode) requer 600 para definir strdup (), embora esteja na especificação de 1995. Mozilla e outros encontraram isso ...

jesup
fonte