3

私はこのコードを見ました:

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

だから私の質問はerrnoint か macroか#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 
4

2 に答える 2

2

C++ (n3376 現在) では、<cerrno> を含める場合、errno はマクロとして定義されます。それ以外の場合、<errno.h> を含める場合、C で定義されているものは何でも (上記を考えると int と思われます) (ただし、調べる必要があります) C標準で(以下のAlokに従って:「errnoがマクロか識別子かは指定されていません」)))。

n3376:

19.4 エラー番号 [errno]

ヘッダー <cerrno> については、表 43 で説明します。その内容は、errno がマクロとして定義されることを除いて、POSIX ヘッダー <errno.h> と同じです。

于 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 に答える