Запрос расширений GNU, но в остальном POSIX-совместимых функций?

Есть ли способ с макросами тестирования функций, чтобы glibc выставлял расширения GNU (функции, не указанные в POSIX, и дополнительные макросы флагов/аргументов для стандартных функций, таких как MAP_ANONYMOUS), но по-прежнему предпочитает семантику POSIX всякий раз, когда определения POSIX и GNU конфликтуют? Я думаю о таких вещах, как basename, strerror_r и т. д.


person R.. GitHub STOP HELPING ICE    schedule 05.09.2011    source источник


Ответы (1)


Для конкретного случая basename() включение заголовка <libgen.h> дает вам определение XPG/POSIX.

MAP_ANONYMOUS не является расширением GNU (_GNU_SOURCE), оно определено, если определено либо _BSD_SOURCE, либо _SVID_SOURCE.

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