当我使用GNU C Library提供的非标准函数时,Clang可以警告我吗?

时间:2014-05-24 19:08:21

标签: c clang

我正在OS X上编写一个C程序并用clang编译它。我是C的新手,我已经明白像getline()这样的函数很有用但非标准。我希望能够在GNU C库不可用的系统上编译程序。我不知道究竟哪些函数是非标准的,我希望有一个命令行开关让clang在我使用这些函数时警告我。有吗?

clang --version的输出:

  

Apple LLVM 5.1版(clang-503.0.40)

4 个答案:

答案 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)

不,没有,主要是因为我所知道的任何项目通常会区分:

  • 编译器
  • 标准库
  • ABI图书馆

通常这3件事被分成不同的项目,并且它们的设计不会相互插入。有时甚至会有一个更加分散的愿景,编译器被分成后端,前端和多个其他模块化项目和插件,就像在带有clang的大型llvm项目中发生的那样。

正如Petesh已经建议的那样,您最好的选择是具有这种能力的建筑系统,您可以编写构建过程的行为脚本并检测宏是否失败,或者目标系统是否提供X功能

我的建议,尤其是初学者,是cmake及其自己的wiki