использованием strdup или использованием strdup?

когда я использую strdup в Microsoft Visual C++ он предупреждает меня:

предупреждение C4996:' strdup': имя POSIX для этого элемента устарело. Вместо этого используйте соответствующее ISO C++ имя: _strdup. См. интерактивную справку.

таким образом _strdup является правильным.

но когда я использую _strdup в GCC (Fedora Linux OS) компилятор показывает ошибку:

ошибка: ‘_strdup’ не был объявлен в этой объем

С GCC и Linux компилятор не показывает никакой ошибки для strdup.

что правильно - strdup или _strdup?

Примечание: я включаю <string.h> в моем коде.

7 ответов


strdup не является стандартной функцией C++. но это, по-видимому, функция Posix, и в любом случае это известная функция который был там с K&R C. Так что если вы абсолютно должны использовать его, не волнуйтесь о любом возможном столкновении имен, и просто напишите strdup для максимальной мобильности.


что правильно?

strdup является совершенно правильной функцией POSIX. Тем не менее, он не принадлежит стандарту, и стандарт ANSI C резервирует некоторые (широкие) классы имен функций для дальнейшего использования. Среди них есть

  • имена функций, которые начинаются с str и буквы

поэтому ребята MS решили заменить strdup с _strdup.

Я просто продолжайте использовать strdup. Вряд ли комитет C определит strdup к чему-то другому, чем POSIX. Либо #define strdup _strdup или отключить предупреждение.

кстати, я надеюсь, вы видите, что это относится к вашим функциям с именами, такими как string_list etc., слишком.


вы можете #define _CRT_NONSTDC_NO_DEPRECATE отключить это предупреждение.


Если вы просто хотите, чтобы избежать предупреждение:

проект - > свойство - > C / C++ - > препроцессор - > определения препроцессора

изменить это и добавить

_CRT_NONSTDC_NO_DEPRECATE


не знаю о C++.

на Стандарт C не описывает какую-либо функцию с помощью strdup name (хотя имя зарезервировано). Чтобы быть портативным, в C, вам лучше заменить это на malloc, strcpy и free.


strdup-это POSIX:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/strdup.html

_strdup специфичен для Windows:

http://msdn.microsoft.com/en-us/library/y471khhc (v=против 80).aspx

в Unix используйте strdup. В Windows, используйте _strdup. Все очень просто. Если вам нужно написать переносимый код между Unix и Windows:

  • использовать системы зависимые макросы (например _WIN32 и _POSIX_VERSION), чтобы выбрать правильную функцию (но обратите внимание, что макросы могут зависеть от конкретных предварительно существующих файлов include):

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html

http://msdn.microsoft.com/en-us/library/b0084kay (v=против 80).aspx

  • используйте стандартные функции для переопределения strdup: strlen, malloc и memmove.

  • использовать крест служебная библиотека платформы, как glib:

http://developer.gnome.org/glib/2.28/glib-String-Utility-Functions.html#g-strdup

обратите внимание, что сообщение Visual C++ предполагает, что _strdup принадлежит стандарту C++, но это false, как это можно проверить на стандарте C++. Он просто использует префикс подчеркивания в качестве "пространства" для функция.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf


это не предупреждение, а сообщение об ошибке в более высокой версии VS.

использовать макрос #ifdef WIN32 переключатель