Hoje eu tive que usar a basename()
função, e o man 3 basename
( aqui ) me deu uma mensagem estranha:
Notas
Existem duas versões diferentes de basename () - a versão POSIX descrita acima e a versão GNU , que é obtida depois
#define _GNU_SOURCE
#include <string.h>
Estou imaginando o que isso #define _GNU_SOURCE
significa: está corrompendo o código que escrevo com uma licença relacionada ao GNU? Ou é simplesmente usado para dizer ao compilador algo como " Bem, eu sei, esse conjunto de funções não é POSIX, portanto não é portátil, mas eu gostaria de usá-lo de qualquer maneira ".
Se sim, por que não dar às pessoas cabeçalhos diferentes, em vez de precisar definir alguma macro obscura para obter uma implementação de função ou outra?
Algo também me incomoda: como o compilador sabe qual implementação de função vincular ao executável? Também usa isso #define
?
Alguém tem algumas dicas para me dar?
_GNU_SOURCE
é obterstrfry
ememfrob
.#define _GNU_SOURCE
recomenda-se que seja "a primeira coisa no arquivo, precedida apenas por comentários")._FILE_OFFSET_BITS
, não_GNU_SOURCE
.Deixe-me responder mais dois pontos:
Uma abordagem comum é
#define
identificar condicionalmentebasename
nomes diferentes, dependendo se_GNU_SOURCE
está definido. Por exemplo:Agora a biblioteca simplesmente precisa fornecer os dois comportamentos sob esses nomes.
Freqüentemente, o mesmo cabeçalho tinha um conteúdo ligeiramente diferente em diferentes versões do Unix, então não existe um conteúdo certo para, digamos,
<string.h>
- existem muitos padrões ( xkcd ). Há todo um conjunto de macros para escolher a sua favorita, de modo que, se o seu programa espera um padrão, a biblioteca estará em conformidade com isso.fonte
Para detalhes exatos sobre o que é ativado por
_GNU_SOURCE
, a documentação pode ajudar.Na documentação do GNU:
Na página de manual do Linux nas macros de teste de recursos :
Nota :
_GNU_SOURCE
precisa ser definido antes da inclusão dos arquivos de cabeçalho para que os respectivos cabeçalhos ativem os recursos. Por exemplo:_GNU_SOURCE
também pode ser ativado por compilação usando o-D
sinalizador:(
-D
não é específico,_GNU_SOURCE
mas qualquer macro deve ser definida dessa maneira).fonte
De alguma lista de discussão via google:
Por isso, permite um monte de sinalizadores de compilação para o gcc
fonte