Strdup или _strdup?
Когда я использую strdup
в Microsoft Visual С++, он предупреждает меня:
warning C4996: 'strdup': имя POSIX для этого элемента устарело. Вместо этого используйте ISO-совместимое имя: _strdup. Подробнее см. Интерактивную справку.
Таким образом, кажется, что _strdup
является правильным.
Но когда я использую _strdup
в GCC (Fedora Linux OS), компилятор показывает ошибку:
error: '_strdup не был объявлен в этой области
В GCC и Linux компилятор не показывает никаких ошибок для strdup
.
Что правильно - strdup
или _strdup
?
Примечание: я включаю <string.h>
в свой код.
Ответы
Ответ 1
strdup
не является стандартной функцией С++. но, по-видимому, это функция Posix, и в любом случае это хорошо известная функция, которая существует с K & R C., поэтому, если вы абсолютно должны ее использовать, не беспокойтесь о возможном столкновении имен и просто напишите strdup
для максимальной портативность.
Ответ 2
Что правильно?
strdup
- совершенно правильная функция POSIX. Тем не менее, он не относится к стандарту, и стандарт ANSI C резервирует некоторые (широкие) классы имен функций для дальнейшего использования. Среди них есть
- Имена функций, начинающиеся с str и строчной буквы
поэтому ребята из MS решили заменить strdup
на _strdup
.
Я бы продолжил использовать strdup
. Маловероятно, что комитет С определит strdup
что-то еще, чем POSIX. Либо #define strdup _strdup
, либо отключите предупреждение.
Кстати. Надеюсь, вы увидите, что это относится к вашим функциям с именами типа string_list
и т.д. тоже.
Ответ 3
Вы можете #define _CRT_NONSTDC_NO_DEPRECATE, чтобы отключить это предупреждение.
Ответ 4
Если вы просто хотите избежать предупреждения:
Project- > свойство → C/С++ → Препроцессор → Определения препроцессора
Отредактируйте это и добавьте
_CRT_NONSTDC_NO_DEPRECATE
Ответ 5
Не знаю о С++.
C Standard не описывает никакой функции с именем strdup
(хотя имя зарезервировано).
Чтобы быть портативным, на C, вам лучше заменить его на malloc
, strcpy
и free
.
Ответ 6
strdup - POSIX:
http://pubs.opengroup.org/onlinepubs/9699919799/functions/strdup.html
_strdup зависит от Windows:
http://msdn.microsoft.com/en-us/library/y471khhc(v=vs.80).aspx
В Unix используйте strdup. В Windows используйте _strdup. Это так просто. Если вам нужно написать переносимый код между Unix и Windows:
- используйте зависящие от системы макросы (например, _WIN32 vs. _POSIX_VERSION), чтобы выбрать правильную функцию (но обратите внимание, что макросы могут зависеть от определенных ранее существующих файлов include):
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html
http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx
-
используйте стандартные функции для переопределения strdup: strlen, malloc и memmove.
-
используйте библиотеку утилиты кросс-платформы, например glib:
http://developer.gnome.org/glib/2.28/glib-String-Utility-Functions.html#g-strdup
Обратите внимание, что сообщение Visual С++ предполагает, что _strdup относится к стандарту С++, но это false, так как он может быть проверен на стандарте С++. Он просто использует префикс подчеркивания как "пространство имен" для этой функции.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf
Ответ 7
это не предупреждение, а ошибка, сообщаемая в более высокой версии vs.
использовать макрос #ifdef WIN32
для переключения