在C11中使用strdup

Mik*_*her 9 c gcc c11

我可以使用gcc 4.7.2版编译以下内容

   #include <string.h>

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

   }
Run Code Online (Sandbox Code Playgroud)

但是当我使用--std = c11标志时,我收到以下警告:

warning: implicit declaration of function ‘strdup’ [-Wimplicit-function-declaration]
warning: initialization makes pointer from integer without a cast [enabled by default]
Run Code Online (Sandbox Code Playgroud)

什么改变导致这个警告?

Lik*_*ike 8

阅读的手册的strdup通过

man strdup
Run Code Online (Sandbox Code Playgroud)

你可以找到

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>
Run Code Online (Sandbox Code Playgroud)

我猜警告是由c11引起的,不能启用上述宏之一.

  • _BSD_SOURCE是一个不寻常的选择.使用-D_POSIX_C_SOURCE = 200809L是一个更广泛和有用的标准. (2认同)

小智 5

你想要 --std=gnu11 或 --std=c11 -D_GNU_SOURCE