Сегодня я должен был использовать basename()
функцию, и man 3 basename
( здесь ) дал мне странное сообщение:
Ноты
Существует две разные версии basename () - версия POSIX, описанная выше, и версия GNU , после которой
#define _GNU_SOURCE
#include <string.h>
Мне интересно, что это #define _GNU_SOURCE
значит: портит ли код, который я пишу, лицензией GNU? Или это просто используется, чтобы сказать компилятору что-то вроде: « Ну, я знаю, этот набор функций не является POSIX, то есть не переносимым, но я бы все равно хотел его использовать ».
Если так, то почему бы не дать людям разные заголовки вместо того, чтобы определять какой-то непонятный макрос, чтобы получить реализацию одной функции или другую?
Что-то меня также беспокоит: как компилятор узнает, какую реализацию функции связать с исполняемым файлом? Это использует это #define
также?
У кого-нибудь есть советы, чтобы дать мне?
_GNU_SOURCE
это для того, чтобы получитьstrfry
иmemfrob
.#define _GNU_SOURCE
рекомендуется быть «самой первой вещью в файле, перед которой должны быть только комментарии»)._FILE_OFFSET_BITS
, а не_GNU_SOURCE
.Позвольте мне ответить еще на два момента:
Распространенным подходом является условно
#define
идентифицироватьbasename
разные имена в зависимости от того_GNU_SOURCE
, определен ли . Например:Теперь библиотеке просто нужно предоставить оба поведения под этими именами.
Часто один и тот же заголовок содержал немного различное содержимое в разных версиях Unix, поэтому, скажем, нет единого правильного содержимого
<string.h>
- существует много стандартов ( xkcd ). Существует целый набор макросов для выбора вашего любимого, так что если ваша программа ожидает один стандарт, библиотека будет соответствовать этому.источник
Точная информация о том, что все включено
_GNU_SOURCE
, может помочь в документации.Из документации GNU:
Из справочной страницы Linux по макросам тестирования функций :
Заметка :
_GNU_SOURCE
необходимо определить перед включением заголовочных файлов, чтобы соответствующие заголовки включали функции. Например:_GNU_SOURCE
можно также включить для каждой компиляции, используя-D
флаг:(
-D
не относится к_GNU_SOURCE
но любой макрос должен быть определен таким образом).источник
Из какого-то списка рассылки через Google:
Так что это позволяет много компилировать флаги для gcc
источник