使用gcc,严格包含C99符号,特别是不包括POSIX

Chr*_*hey 11 c compiler-construction macos linker gcc

经过多年的编程,我正在修课.我的导师没有使用POSIX机器,最近我因index在作业中使用该功能而受到处罚.我做了一些研究,我注意到虽然它index是AT&T Unix的早期部分并且符合POSIX标准,但它不是C99标准的一部分.我希望gcc帮我找到类似符号的用法.我正在使用gcc 4.2(不是 llvm)编译OSX

我的第一站研究涉及注意我的string.h文件包含原型,用于index以下检查功能测试宏:

#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
Run Code Online (Sandbox Code Playgroud)

经过一番挖掘后,我发现了这个(在我看来/usr/include/sys/cdefs.h):

 /* STRICT  Defining _POSIX_C_SOURCE or _XOPEN_SOURCE restricts the
 *      available APIs to exactly the set of APIs defined by the
 *      corresponding standard, based on the value defined.
 *
 *      A correct, portable definition for _POSIX_C_SOURCE is 200112L.
 *      A correct, portable definition for _XOPEN_SOURCE is 600L.
 */
Run Code Online (Sandbox Code Playgroud)

所以使用这个gcc命令:

gcc -D _POSIX_C_SOURCE=200112L -pedantic -Wall -std=c99 -o myExec ./mySource.c
Run Code Online (Sandbox Code Playgroud)

得到一个体面的警告:

warning: incompatible implicit declaration of built-in function ‘index’
Run Code Online (Sandbox Code Playgroud)

这混淆了我,并且我想使程序无法和链接.它让我困惑的原因是,我在opengroup.org上读到,定义该宏应该暴露 POSIX符号,而不是隐藏它们.所以这是我的问题,简洁的形式:

如何制作gcc 4.2(在OSX 10.6上)在一个严格的 C99 环境中编译和链接我的程序,没有其他符号可用?

理想情况下,我希望在编译期间发出警告并且无法链接.我希望答案不涉及告诉gcc我正在编写POSIX代码,当我认为这与我想说的相反时.我不明白的是什么?

Die*_*Epp 11

  1. 抱歉,你不会收到链接错误.图书馆不这样做.该index函数标准库的一部分.标准库同时支持多个版本的C(和POSIX),宏选择暴露哪些原型.

  2. -ansi标志等同于-std=c89,所以停止这样做.

  3. 您是正确的,它_POSIX_C_SOURCE公开了其他功能,但它也指定了要公开的功能版本.定义_POSIX_C_SOURCE=200112L意味着index出现<strings.h>而不是<string.h>.它还在那里.指定2008 POSIX将index完全摆脱,因为它已从更高版本的POSIX标准中删除.

  4. 还有,这意味着"仅ANSI C"的宏,那就是_ANSI_SOURCE.

  5. 您可以通过添加来获取编译错误(但不是链接错误)-Werror-implicit-function-declaration.

$ gcc -Werror-implicit-function-declaration \
    -D_ANSI_SOURCE -pedantic -Wall -std=c99 ...
error: implicit declaration of function 'index'

这似乎适用于OS X 10.5/10.8,GCC 4.0/4.2的所有组合.