经过多年的编程,我正在学习 C 类(class)。我的老师没有使用 POSIX 机器,我最近因在作业中使用 index
函数而受到处罚。我做了一些研究,我注意到虽然 index
是 AT&T Unix 的早期部分并且符合 POSIX,但它不是 C99 标准的一部分。我希望 gcc 帮助我找到类似符号的使用。我正在使用 gcc 4.2(不是 llvm)在 OSX 上编译
我的第一站研究涉及注意到我的 string.h 文件在以下功能测试宏检查中包装了 index
的原型(prototype):
#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’
这让我很困惑,我也想让程序无法链接。它让我困惑的原因是,我读到 at opengroup.org 定义该宏应该 公开 POSIX 符号,而不是隐藏它们。所以这是我简洁的问题:
如何使 gcc 4.2(在 OSX 10.6 上)在没有附加符号的严格 C99 环境中编译和链接我的程序?
理想情况下,我希望在编译期间出现 警告并且无法链接 。我希望答案不涉及告诉 gcc 我正在编写 POSIX 代码,当我认为这与我想告诉它的相反时。我不明白什么?
最佳答案
index
函数是标准库的一部分。标准库同时支持多个版本的 C(和 POSIX),宏选择暴露哪些原型(prototype)。 -ansi
标志相当于 -std=c89
,所以停止这样做。 _POSIX_C_SOURCE
公开了附加功能,但它也指定了要公开哪个版本的功能。定义 _POSIX_C_SOURCE=200112L
意味着 index
出现在 <strings.h>
而不是 <string.h>
。它仍然存在。指定 2008 POSIX 将完全摆脱 index
,因为它已从 POSIX 标准的更高版本中删除。 _ANSI_SOURCE
。 -Werror-implicit-function-declaration
可以获得编译错误(但不是链接错误)。 $ gcc -Werror-implicit-function-declaration\
-D_ANSI_SOURCE -pedantic -Wall -std=c99 ...
错误:函数“index”的隐式声明
这似乎适用于 OS X 10.5/10.8、GCC 4.0/4.2 的所有组合。
关于c - 使用 gcc,严格包含 C99 符号,特别排除 POSIX,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11930144/