在C11中使用strdup函数

13

我能够使用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]

是什么导致了这个警告?


1
这封邮件表明 strdup 在 C11 中是标准的,但我在其他地方找不到它。 - Kninnug
1
我认为strdup不是C标准,据我所记只是一个POISX函数。 - Jonatan Goebel
2个回答

9

阅读 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未启用上述宏之一所导致的。

3
_BSD_SOURCE 是一个不常见的选择。使用 -D_POSIX_C_SOURCE=200809L 更为广泛且实用。 - Jetski S-type

6
你需要使用--std=gnu11或--std=c11 -D_GNU_SOURCE。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接