经过多年的编程,我正在学习 C 课程。我的导师没有使用 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)
经过一番挖掘,我发现了这个(在我的/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.
*/
所以使用这个 gcc 命令:
gcc -D _POSIX_C_SOURCE=200112L -pedantic -Wall -std=c99 -o myExec ./mySource.c
我确实得到了一个体面的警告:
warning: incompatible implicit declaration of built-in function ‘index’
这让我很困惑,我想让程序也无法链接。它让我感到困惑的原因是,我在 opengroup.org上读到定义该宏应该公开POSIX 符号,而不是隐藏它们。所以这是我的一个简洁的问题:
如何使 gcc 4.2(在 OSX 10.6 上)在严格为C99 且没有其他可用符号的环境中编译和链接我的程序?
理想情况下,我希望在编译和链接失败期间出现警告。我希望答案不涉及告诉 gcc 我正在编写 POSIX 代码,而我认为这与我想告诉它的相反。我不明白什么?