использованием 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
переключатель