Есть ли способ с макросами тестирования функций, чтобы glibc выставлял расширения GNU (функции, не указанные в POSIX, и дополнительные макросы флагов/аргументов для стандартных функций, таких как MAP_ANONYMOUS
), но по-прежнему предпочитает семантику POSIX всякий раз, когда определения POSIX и GNU конфликтуют? Я думаю о таких вещах, как basename
, strerror_r
и т. д.
Запрос расширений GNU, но в остальном POSIX-совместимых функций?
Ответы (1)
Для конкретного случая basename()
включение заголовка <libgen.h>
дает вам определение XPG/POSIX.
MAP_ANONYMOUS
не является расширением GNU (_GNU_SOURCE
), оно определено, если определено либо _BSD_SOURCE
, либо _SVID_SOURCE
.
person
caf
schedule
05.09.2011
Это довольно неприятно, потому что есть некоторые вещи (лучший пример —
MAP_ANONYMOUS
), которых нет в POSIX, но которые существуют повсеместно и которые вам действительно нужны для написания многих программ. Но добавление _GNU_SOURCE
означает, что все виды функций могут сломаться, потому что ребята из GNU (или, скорее, Ульрих Дреппер) решили, что их способ лучше стандартного... Возможно, есть какой-то другой макрос, такой как _BSD_SOURCE
, который получит все важные вещи...
- person R.. GitHub STOP HELPING ICE; 05.09.2011
@R.: Да,
_GNU_SOURCE
не включается при вызове gcc по умолчанию и требуется только для вещей, защищенных __USE_GNU
— вызов gcc по умолчанию дает вам _BSD_SOURCE
, _SVID_SOURCE
, _POSIX_SOURCE
и _POSIX_C_SOURCE=200112L
, который содержит почти все, что вам обычно нужно.
- person caf; 05.09.2011
Проблема в том, что переносимая программа не может полагаться на среду по умолчанию, состоящую в основном из POSIX, плюс некоторые дополнения. В некоторых системах значение по умолчанию ужасно несовместимо, и
-D_POSIX_C_SOURCE=...
действительно необходимо. Также часто требуется POSIX 2008/XOPEN 7, который по какой-то причине еще не установлен по умолчанию...
- person R.. GitHub STOP HELPING ICE; 05.09.2011
К сожалению,
_GNU_SOURCE
также дает вам совершенно другую версию strerror_r
.
- person Dietrich Epp; 05.09.2011
@R.: Конечно, но вы можете явно запросить те определения, которые используются по умолчанию (хотя, вероятно, в более поздней версии
_POSIX_C_SOURCE
). Я просто указал, что _GNU_SOURCE
на самом деле не нужен ни для чего важного, поскольку он даже не включен в значения по умолчанию.
- person caf; 05.09.2011
@R.: Если это так, это должно быть недавнее изменение - моя версия никогда не определяет
_GNU_SOURCE
сама по себе, она полагается на то, что она определяется извне. Я думаю, дело в том, что вы получите все действительно полезные вещи только с BSD, SYSV и POSIX.
- person caf; 05.09.2011
Он может не определять
_GNU_SOURCE
(мне нужно будет проверить это снова), но он по-прежнему определяет макросы __USE
(учитываемые другими заголовками), как если бы был определен _GNU_SOURCE
...
- person R.. GitHub STOP HELPING ICE; 05.09.2011
Я принимаю этот ответ, потому что
_SVID_SOURCE
и _BSD_SOURCE
в дополнение к стандартным макросам POSIX/XSI кажутся наиболее близкими к решению для большинства желаемых функций (например, MAP_ANONYMOUS
).
- person R.. GitHub STOP HELPING ICE; 22.09.2011