Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux上的strdup正在使用哪个宏?_C_Strdup - Fatal编程技术网

C Linux上的strdup正在使用哪个宏?

C Linux上的strdup正在使用哪个宏?,c,strdup,C,Strdup,我在StackOverflow上的代码示例中看到了使用strdup,并尝试在Linux上使用它(3.0.0-21-generic x86_64) 编译器(clang)知道它在string.h中,但仍然抱怨即使包含string.h,也没有原型。结果表明,strdup被包装在一个#中,如果定义了,则包装在string.h中。我搜索了这个网站,发现一篇帖子说strdup是一个POSIX例程,而不是一个C标准库例程 可能会公开它的宏有 __使用SVID __使用BSD __使用\u XOPEN\u扩展

我在StackOverflow上的代码示例中看到了使用strdup,并尝试在Linux上使用它(3.0.0-21-generic x86_64)

编译器(clang)知道它在string.h中,但仍然抱怨即使包含string.h,也没有原型。结果表明,strdup被包装在一个#中,如果定义了,则包装在string.h中。我搜索了这个网站,发现一篇帖子说strdup是一个POSIX例程,而不是一个C标准库例程

可能会公开它的宏有

  • __使用SVID
  • __使用BSD
  • __使用\u XOPEN\u扩展
  • __使用_XOPEN2K8
其中每一项都未在stdlib.h中包含的features.h中定义

为什么POSIX宏不在该列表中?人们使用哪个宏/编译器开关在string.h中公开strdup

编辑:根据吉姆下面的评论,我发现

#define _POSIX_SOURCE 1 

在上面

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
编辑2:根据Keith的评论,我发现这同样有效:

#define _POSIX_C_SOURCE 200809L
编辑3:根据乔纳森的评论,这些同样有效

#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700

你用的是。。。宏是供内部使用的。您应该定义_POSIX_SOURCE,或者可能定义feature.h中注释中描述的其他功能宏之一。。。例如,从我刚从网上抓到的一个版本(显然是一个旧的,有些过时的版本)

因此,定义GNU源将为您带来一切

编辑:根据基思·汤普森的评论,你需要

 #define _POSIX_C_SOURCE 200809L

对于strdup.

如果我将#define(定义)POSIX(源代码1#define(定义)POSIX(源代码1)或#define(定义)POSIX(源代码1)放在程序顶部。它下面包括stdlib.h、string.h和stdio.h。但是_BSD_SOURCE和_SVID_SOURCE可以工作。根据我系统上的手册页,您需要定义(这对我有效)POSIX_C_SOURCE 200809L(这对我有效)。在有人提到的论点中,“如果有两行简单的、有保证的工作方式-为什么要依赖于不可移植的功能?”@DouglasB.stape:同意。另一方面,
strdup
由POSIX定义;如果程序的其余部分依赖于POSIX,那么没有充分的理由不使用
strdup()
@Scooter,因为您没有抓住要点。你难道不想知道为什么那条评论得到了9票?Pat编写了他/她自己版本的strdup,其中有一个明显的bug。。。它不会检查malloc是否失败,如果malloc失败,您将得到未定义的行为(很可能是segvio)。。。它不仅仅将空值传递回strdup的调用者。也许帕特认为你犯了同样的错误。关键是,strdup的库版本不会有这样的bug。你当然应该在
#define(定义)XOPEN(源代码700)
(这相当于要求POSIX 2008)中找到它,而且因为它在1997年的X/Open版本中出现过,所以你也可以使用500或600的值。@JonathanLeffler是的,这三个都可以。我将在中编辑它们。
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700
   __STRICT_ANSI__  ANSI Standard C.
   _POSIX_SOURCE    IEEE Std 1003.1.
   _POSIX_C_SOURCE  If ==1, like _POSIX_SOURCE; if ==2 add IEEE Std 1003.2.
   _BSD_SOURCE      ANSI, POSIX, and 4.3BSD things.
   _SVID_SOURCE     ANSI, POSIX, and SVID things.
   _GNU_SOURCE      All of the above, plus GNU extensions.
 #define _POSIX_C_SOURCE 200809L