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 strdup
diz:
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 #include
s, 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
, #define
ou usar uma nova função, porque às vezes o comportamento deles muda dependendo das opções e opções que #define
você tem, por exemplo, com basename (3) .
Veja também:
-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_SOURCE
ou 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.
fonte
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.
fonte
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 ...
fonte