3

我看过这段代码:

#if !defined(errno)
extern int errno;
#endif

所以我的问题是errnoint 还是 macro ,因为#ifif 可以检查是否定义了宏,并且在我们完成之后extern int errno;

在 errno.h 中是这样定义的

#ifdef  _ERRNO_H

/* Declare the `errno' variable, unless it's defined as a macro by
   bits/errno.h.  This is the case in GNU, where it is a per-thread
   variable.  This redeclaration using the macro still works, but it
   will be a function declaration without a prototype and may trigger
   a -Wstrict-prototypes warning.  */
#ifndef errno
extern int errno;
#endif


#endif 
4

2 回答 2

2

在 C++ 中(从 n3376 开始),如果包含 <cerrno>,则 errno 被定义为宏,否则如果包含 <errno.h>,则它是在 C 中定义的任何内容(我怀疑上面给出的 int(但您需要查看在 C 标准中(根据下面的 Alok:“未指定 errno 是宏还是标识符”)))。

n3376:

19.4 错误编号 [errno]

表头 <cerrno> 在表 43 中描述。它的内容与 POSIX 头 <errno.h> 相同,只是 errno 应定义为宏。

于 2013-01-28T06:15:04.760 回答
-1

查看http://www.cplusplus.com/reference/cerrno/errno/ 。标准似乎将 errno 定义为 c++ 的宏。

该宏扩展为 int 类型的可修改左值,因此它可以被程序读取和修改。

在 C++ 中,errno 始终声明为宏,但在 C 中,它也可以实现为具有外部链接的 int 对象。

cppreference添加了有关 C++11 的更多细节。

errno 是一个预处理器宏,可扩展为 int 类型的静态(C++11 前)/线程本地(C++11 起)可修改左值。

于 2013-01-28T06:15:33.227 回答