经过多年的编程,我正在学习 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 C”,即 _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/

    10-13 07:42