gpt4 book ai didi

c - mkdtemp 需要 _DARWIN_C_SOURCE 用于 unistd.h

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:36 24 4
gpt4 key购买 nike

我有点疑惑。我有编译的项目

CFLAGS=-g -O2 -Wall -Wextra -Isrc/main -pthread -rdynamic -DNDEBUG $(OPTFLAGS) -D_FILE_OFFSET_BITS=64 -D_XOPEN_SOURCE=700

现在我想使用 mkdtemp 并因此包含 unistd.h

char *path = mkdtemp(strdup("/tmp/test-XXXXXX"));

在 MacOSX 上编译会给出一些警告

warning: implicit declaration of function ‘mkdtemp’
warning: initialization makes pointer from integer without a cast

但是编译通过。虽然 mkdtemp 确实返回一个非 NULL 路径,但访问它会导致 EXC_BAD_ACCESS。

问题 1:模板是 strdup()ed,结果是非 NULL。这到底是怎么导致 EXC_BAD_ACCESS 的?

现在深入兔子洞。让我们摆脱警告。检查 unistd.h 我发现预处理器隐藏了声明。

#if     !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
...
char *mkdtemp(char *);
...
#endif

-D_D_DARWIN_C_SOURCE 添加到构建中,所有问题都消失了,但给我留下了一个特定于平台的构建。 10.6 手册页只是说

 Standard C Library (libc, -lc)
#include <unistd.h>

从构建中删除 _XOPEN_SOURCE 可以在 OSX 上运行,但在 Linux 下无法编译

warning: ‘struct FTW’ declared inside parameter list
warning: its scope is only this definition or declaration, which is probably not what you want
In function ‘tmp_remove’:
warning: implicit declaration of function ‘nftw’
error: ‘FTW_DEPTH’ undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
error: for each function it appears in.)
error: ‘FTW_PHYS’ undeclared (first use in this function)

问题 2:那么您将如何解决这个问题?

我发现的唯一修复方法是在 unistd.h 包含之前添加 #undef _POSIX_C_SOURCE ...但这感觉像是一个丑陋的 hack。

最佳答案

你在这里问了两个问题,我只回答第一个问题:

Question 1: The template is strdup()ed and the result is non-NULL. How on earth can this result in an EXC_BAD_ACCESS?

正如上面的警告告诉你的:

warning: implicit declaration of function ‘mkdtemp’

这意味着它找不到mkdtemp 的声明。根据 C 规则,这是允许的,但它假设函数返回一个 int。

warning: initialization makes pointer from integer without a cast

您已经告诉编译器“我有一个返回 int 的函数,我想将值存储在 char* 中”。它警告你这是个坏主意。您仍然可以这样做,因此它可以编译。

但是想想运行时会发生什么。您链接到的实际代码返回一个 64 位 char*。然后您的代码将其视为必须转换为 64 位 char* 的 32 位 int。成功的可能性有多大?

这就是您不忽略警告的原因。

关于c - mkdtemp 需要 _DARWIN_C_SOURCE 用于 unistd.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11440787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com