Использование strdup в C11

Я могу скомпилировать следующее, используя gcc версии 4.7.2.

   #include <string.h>

   int main(){
    char text[] = "String duplicate";
    char* dup = strdup(text);
    return 0;

   }

Но когда я использовал флаг --std=c11, я получаю следующее предупреждение:

warning: implicit declaration of function ‘strdup’ [-Wimplicit-function-declaration]
warning: initialization makes pointer from integer without a cast [enabled by default]

Что изменилось, чтобы вызвать это предупреждение?


person Mike Fisher    schedule 28.10.2013    source источник
comment
Это письмо предполагает, что strdup является стандартным в C11, но я могу больше нигде не найти.   -  person Kninnug    schedule 28.10.2013
comment
Я не думаю, что strdup является стандартом C, насколько я помню, это всего лишь функция POISX.   -  person Jonatan Goebel    schedule 28.10.2013


Ответы (2)


Прочтите руководство по strdup от

man strdup

Вы можете найти это

Требования к макросам тестирования функций для glibc (см. feature_test_macros(7)):

strdup(): _SVID_SOURCE || _BSD_ИСТОЧНИК || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED || /* Начиная с glibc 2.12: */ _POSIX_C_SOURCE >= 200809L

Это означает, что strdup соответствует SVr4, 4.3BSD, POSIX.1-2001.

Таким образом, вы можете избавиться от предупреждений,

gcc -D_BSD_SOURCE -std=c11 <your source file>

Я предполагаю, что предупреждения вызваны тем, что c11 не включает один из вышеуказанных макросов.

person Like    schedule 28.10.2013
comment
_BSD_SOURCE — необычный выбор. Использование -D_POSIX_C_SOURCE=200809L является более широким и полезным стандартом. - person Jetski S-type; 07.11.2018

вы хотите --std=gnu11 или --std=c11 -D_GNU_SOURCE

person JTAS    schedule 01.12.2013