如何在OS X上使用clang编译c11标准库?

3

嘿,我正在尝试在OS X上使用clang编译使用c11标准库函数的c代码。

编译器选项-std=c11允许我使用c11语言特性。但是当我使用新函数(例如at_quick_exit)时,会出现以下警告:implicit declaration of function 'at_quick_exit' is invalid in C99

源代码有以下行:#include <stdlib.h>。 clang选项-stdlib没有帮助。

我的系统:

OS X Yosemite 10.10.3

$ clang -v
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix

Ubuntu 14.04 LTS

$ clang -v
Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu 
Thread model: posix

更明确地说,我如何在OS X上获取c11标准库?
谢谢任何形式的帮助。

调用 at_quick_exit 函数的源代码是否也有以下行:#include <stdlib.h>? - user3629249
其他stackoverflow的问题有答案表明'quick_exit()'在OSX中没有实现。我的系统,ubuntu 14.04,也没有'quick_exit()'和'at_quick_exit()'!这两个都是系统级函数。建议使用'exit()'和'atexit()'来实现相同的功能。 - user3629249
1个回答

1
通常,单独的自托管系统编译器并不提供完整的标准C环境,包括运行时库。通常情况下,底层系统提供大部分(如果不是全部)库(和头文件),而编译器只负责编译。
因此,如果您需要一些在特定系统上没有提供的特定函数,则必须自己编写这些函数,或从某个便携式库中获取它们,该库与您的目标系统兼容。
在这种特殊情况下,您还可能发现系统的libc本身并未提供quick_exit(),因此编写这两个函数应该很容易。

1
如果foo是一个标准化函数的名称,那么编写自己名为foo的函数是未定义行为,因此我建议不要使用标准名称调用这两个函数。 - Pascal Cuoq
那是一个牵强附会的论点。标准中没有任何魔法可以引起任何现实世界的问题——如果它能工作,那就好了,如果它能使代码与未来环境兼容,那就更好了。当然,理想情况下,替换应该在单独的编译单元中,并且只有在目标没有“标准”实现时,才会被构建系统选择。 - Greg A. Woods

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