我看过这段代码:
#if !defined(errno)
extern int errno;
#endif
所以我的问题是errno
是int还是宏,因为使用#if
if是否可以检查宏定义与我们在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
答案 0 :(得分:2)
在C ++中(截至n3376),如果包含< cerrno>,则将errno定义为宏。否则,如果你包括< errno.h>它是在C中定义的任何内容(我怀疑上面给出了一个int(但是你需要查看C标准(按照下面的Alok:“未指定errno是宏还是标识符”))。 / p>
标题< cerrno>表43中描述了它的内容。它的内容与POSIX标题< errno.h>相同,除了errno应被定义为宏。
答案 1 :(得分:-1)
签出http://www.cplusplus.com/reference/cerrno/errno/。看来标准将errno定义为c ++的宏。
此宏扩展为int类型的可修改左值,因此它可以由程序读取和修改。
在C ++中,errno总是声明为宏,但在C中它也可以实现为具有外部链接的int对象。
cppreference增加了有关C ++ 11的更多细节。
errno是一个预处理器宏,它扩展为静态(直到C ++ 11)/线程局部(自C ++ 11)可修改的int类型左值。