错误:使用未声明的标识符“errno_t”

Posted

技术标签:

【中文标题】错误:使用未声明的标识符“errno_t”【英文标题】:error: use of undeclared identifier 'errno_t' 【发布时间】:2014-08-04 02:40:52 【问题描述】:

这是我死掉的简单虚拟代码:

#include <errno.h>

int main(void)

    errno_t e;
    return 0;

这令人惊讶地引发了这个错误:

main.c:5:5: error: use of undeclared identifier 'errno_t'
    errno_t x;
    ^

我开始跟踪:当编译器看到&lt;...&gt; 包含时,它会首先查看/usr/include,当然我在其中找到了errno.h 文件。实际上它只有一行,除了许可注释之外,它是:

#include <sys/errno.h>

现在,在errno.h 中的/usr/include/sys,我发现了以下几行:

#include <sys/cdefs.h>

#if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1
#include <sys/_types/_errno_t.h>
#endif

/usr/include/_types _errno_t.h 我发现了这个:

typedef int errno_t;

看起来,它就在那里,它是整数类型的别名,是errno.h 的一部分——正如它应该的那样。

那为什么不包括在内?为什么编译器会引发未声明的标识符错误?

提前致谢!


相关信息:

Compiler:
    Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)`

Compiler flags:
    -std=c11 -I/usr/include/sys -I/usr/local/include

宏变量__STDC_WANT_LIB_EXT1__ 将定义在/usr/include/sys in cdefs.h 的以下行中:

/* If the developer has neither requested a strict language mode nor a version
 * of POSIX, turn on functionality provided by __STDC_WANT_LIB_EXT1__ as part
 * of __DARWIN_C_FULL.
 */
#if !defined(__STDC_WANT_LIB_EXT1__) && !defined(__STRICT_ANSI__) && __DARWIN_C_LEVEL >= __DARWIN_C_FULL
#define __STDC_WANT_LIB_EXT1__ 1
#endif

更新:

正如@PaulR 在评论部分所说:如果我删除-std=c11 标志,它会编译。如果包含标志,这与引发的错误一样令人惊讶。所以我用一个子问题来扩展这个问题:

当为编译器指定标准时,errno_t 不是 C11 标准的一部分,或者为什么不包含它?

【问题讨论】:

您是否包含cdefs.h(直接或通过其他包含)? __STDC_WANT_LIB_EXT1__ 是根据条件定义的。满足这个条件了吗? @BlueMoon 更新了帖子——/usr/include/sys/errno.h 在检查 var 是否已定义之前包含了内容 这是因为您使用-std=c11 进行编译 - 把它去掉,或者使用不太严格的-std=gnu11,它会编译得很好。 然后我更新问题。谢谢@PaulR! @PeterVaro:不,它是附件 K 的一部分,除了声称支持它的实现之外,它不是规范性的。 【参考方案1】:

errno_t 不是标准类型;它是 ISO C11 中可选的(并且广泛不喜欢和不受支持的)附件 K 的一部分,只是因为一个特定的供应商有无视和破坏该标准的历史。

由于附件K将errno_t定义为int,所以errno对象的类型为int,所有错误码均为int,在你的程序中使用int即可。它比依赖不太可能受支持的可选功能更便携。

【讨论】:

给他们时间——他们花了 15 年时间才掌握了 C99! 更大的问题是他们试图将他们对语言的无用添加强加到他们没有兴趣或意图遵循的标准中。这不是标准应该起作用的方式。如果您不想遵循标准,则不应参与尝试塑造它。 @R..GitHubSTOPHELPINGICE 为什么不呢?在那个位置上,我希望标准跟随

以上是关于错误:使用未声明的标识符“errno_t”的主要内容,如果未能解决你的问题,请参考以下文章

在 CoreLocation 中使用未声明的标识符错误

发布 iOS 构建错误 - 使用未声明的标识符“Twitter”

Google iOS SDK 无法存档(使用未声明的标识符错误)

iOS:Objective-C 创建类属性错误:使用未声明的标识符

接收构建失败错误“使用未声明的标识符‘ParseClientConfiguration’”

错误:使用未声明的标识符“vmaxq_f16”