Подтвердить что ты не робот

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> в свой код.

4b9b3361

Ответ 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 для переключения