Използване на 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_SOURCE || _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