我正在OS X上编写一个C程序并用clang编译它。我是C的新手,我已经明白像getline()
这样的函数很有用但非标准。我希望能够在GNU C库不可用的系统上编译程序。我不知道究竟哪些函数是非标准的,我希望有一个命令行开关让clang在我使用这些函数时警告我。有吗?
clang --version
的输出:
Apple LLVM 5.1版(clang-503.0.40)
答案 0 :(得分:3)
您可以使用feature test macros(另请参阅:XSH 2.2.1 POSIX.1 Symbols)来请求仅查看特定的一组标准接口。特别是,
-D_XOPEN_SOURCE=600
在命令行或
#define _XOPEN_SOURCE 600
应该为过时的2001版POSIX(最新的OSX支持)公开POSIX base和XSI选项。如果您只想要基础,没有XSI,请将_POSIX_C_SOURCE
定义为200112L
。
答案 1 :(得分:2)
没有命令行开关说'告诉我这是不是非标准'。开发需要在各种平台上兼容的代码的最常见方法是gnu autotools suite,它为您提供了一个配置脚本,用于检查各种功能并允许您对其进行编码,或让系统放弃在继续之前。
答案 2 :(得分:1)
您可以定义像_POSIX_C_SOURCE
这样的功能测试宏。当_POSIX_C_SOURCE
存在且未定义实现定义的特征测试宏(如_BSD_SOURCE
或_GNU_SOURCE
)时,需要符合实现来隐藏任何扩展(即额外的库函数):
#define _POSIX_C_SOURCE 200809L
如果您尝试使用扩展并定义了此宏,则会收到警告(ANSI模式)或错误(C99)模式,因为该函数的原型不存在。
对于Mac OS X,没有POSIX.1 2008支持。因此,您必须像这样定义宏以获得POSIX.1 2001支持:
#define _POSIX_C_SOURCE 200112L
请注意,在POSIX.1 2008中删除了一些函数,但这并不重要,因为这些函数通常(读取:始终)存在于目标系统上,因为它可能也支持POSIX.1 2001。
答案 3 :(得分:1)