ошибка strdup на g ++ с c ++ 0x - PullRequest
5 голосов
/ 07 апреля 2011

У меня есть код C ++ 0x.Я смог воспроизвести это ниже.Приведенный ниже код прекрасно работает без -std=c++0x, однако мне нужен его для моего реального кода.

Как включить strdup в C ++ 0x?с gcc 4.5.2

заметьте, я использую mingw.я попытался включить cstdlib, cstring, string.h и попытался использовать std ::.Не повезло.

>g++ -std=c++0x a.cpp
a.cpp: In function 'int main()':
a.cpp:4:11: error: 'strdup' was not declared in this scope

код:

#include <string.h>
int main()
{
    strdup("");
    return 0;
}

Ответы [ 4 ]

8 голосов
/ 29 ноября 2012

-std = gnu ++ 0x (вместо -std = c ++ 0x) помогает мне; -D_GNU_SOURCE не работает (я пробовал с кросс-компилятором, но, возможно, он работает с другими типами g ++).

Похоже, что по умолчанию (no -std = ... пройдено) указано "GNU C ++", а не "строгий стандарт C ++", поэтому флаг "ничего не менять, кроме обновления до C ++ 11" is -std = gnu ++ 0x, а не -std = c ++ 0x; последнее означает «обновить до C ++ 11 и быть более строгим, чем по умолчанию».

6 голосов
/ 07 апреля 2011

strdup не может быть включен в библиотеку, с которой вы ссылаетесь (вы упомянули mingw).Я не уверен, что это в c ++ 0x или нет;Я знаю, что это не в более ранних версиях стандартов C / C ++.

Это очень простая функция, и вы могли бы просто включить ее в свою программу (хотя это недопустимо называть просто "strdup", так как все имена начинаютсяс "str" ​​и строчной буквой зарезервированы для расширений реализации.)

char *my_strdup(const char *str) {
    size_t len = strlen(str);
    char *x = (char *)malloc(len+1); /* 1 for the null terminator */
    if(!x) return NULL; /* malloc could not allocate memory */
    memcpy(x,str,len+1); /* copy the string into the new buffer */
    return x;
}
2 голосов
/ 07 апреля 2011

На этой странице объясняется, что strdup соответствует, среди прочего, стандартам POSIX и BSD, и что расширения GNU реализуют его. Может быть, если вы скомпилируете свой код с "-D_GNU_SOURCE", это сработает?

РЕДАКТИРОВАТЬ : просто чтобы немного расширить, вам, вероятно, не нужно ничего другого, кроме включения cstring в системе POSIX. Но вы используете GCC в Windows, которая не является POSIX, поэтому вам нужно дополнительное определение для включения strdup.

0 голосов
/ 20 апреля 2016

добавить этот препроцессор "_CRT_NONSTDC_NO_DEPRECATE" в Свойства проекта-> Сборка C / C ++-> Компилятор GCC C ++-> Препроцессор-> Настройки инструмента

Не забудьте проверить только препроцессор (-E)

Это работало для меня на Windows MINGW32.

...