質問

extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr)
 __THROW;

また、上記の機能の定義では/usr/include/netinet/ルエーテルです。hす。

できる人については、ダブルマイの平均の前にconst(キーワード),addr(識別子)や__THROW.

役に立ちましたか?

解決

Cにおいて、シンボルは大文字または別の下線のいずれかに続いてアンダー始まるは、実装のために予約されています。 Cのユーザーとしてあなたは予約済みのシーケンスで始まる任意のシンボルを作成しないでください。 C ++では、制限はより厳格です。あなたは、ユーザーがダブルアンダースコアを含むシンボルを作成することはできません。

が与えられます:

extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr)
__THROW;

__const表記が可能(やや低い)を可能にすることがあることを、このコードがサポートするプロトタイプの表記で使用されているが、C89標準のキーワードconstの正しい理解を持っていませんコンパイラ。 autoconfマクロは、まだコンパイラがconstの作業をサポートしているかどうかを確認することができます。このコードは、そのサポートを持っていない壊れたコンパイラで使用することができます。

__hostname__addrの使用はあなたのための保護対策、ヘッダの利用者です。あなたはGCCと-Wshadowオプションを指定してコンパイルした場合、任意のローカル変数はグローバル変数をシャドウするとき、コンパイラが警告を表示します。機能を使用している場合だけhostnameの代わりに__hostname、そしてあなたがhostname()と呼ばれる機能を持っていた場合、シャドウイングがあると思います。実装に予約名を使用することにより、あなたの正当なコードで競合は発生しません。

__THROWの使用は、コードは、いくつかの状況下で、「スロー指定」のいくつかの並べ替えを使用して宣言することができることを意味します。これは、標準のCではありません。それはより多くのC ++のようなものです。しかし、コードがあれば、空の、または標準のC構文の一部コンパイラ固有の拡張に__THROWを定義するヘッダー(またはコンパイラ自体)の一つとして、Cコンパイラで使用することができます。

<時間>

C標準のセクション7.1.3(ISO 9899:1999)は述べています:

  

7.1.3予約済みの識別子

     

各ヘッダーは、宣言またはその関連する箇条に記載されているすべての識別子を定義し、そして   必要に応じてそれに関連する将来のライブラリ方向にリストされた識別子を宣言または定義します   副次句と常に使用するため、またはファイルとして使用するためのいずれかに予約されている識別子   スコープ識別子ます。

     

- アンダースコアで始まるすべての識別子と大文字または他のいずれか   アンダースコアは、常に使用するために予約されています。

     

- アンダースコアで始まるすべての識別子は常に識別子として使用するために予約されています   普通のタグの名前空間の両方のファイルスコープ付きます。

     

- 未来の図書館を含む以下の節のいずれかの中の各マクロ名(   方向)その関連ヘッダーのいずれかが含まれている場合、指定として使用するために予約されています。   特に明記しない限り、(7.1.4を参照)。

     

- (含む以下の節のいずれかで外部結合を持つすべての識別子   将来のライブラリ方向)常に外部との識別子として使用するために予約されています   リンケージ 154)

     

- を含む以下の節のいずれかに記載されているファイルスコープを持つ各識別子(   将来ライブラリ方向)はマクロ名としてとを持つ識別子として使用するために予約されています   それに関連するヘッダのいずれかが含まれている場合は、同じ名前空間にスコープを提出ます。

     

他の識別子が予約されていません。プログラムは、宣言したりして識別子を定義している場合   それは(7.1.4によって許容されるよう以外)予約、または予約を画定されているコンテキスト   マクロ名としての識別子、動作は保証されません。

     

プログラム(#undefで)最初に識別子の任意のマクロ定義を削除した場合   上記の基は、結果は未定義である。

     

脚注154)外部結合を持つ予約識別子のリストはerrnomath_errhandlingを含み、   setjmp、およびva_endます。

<時間>

のhref = "https://stackoverflow.com/questions/228783/what-are- <も参照してください。-ルールについて-使用-アンダースコア・イン・AC-識別子/ 228797#228797" > C ++の識別子の中でアンダースコアを使用する方法についての規則は何であり、同じルールの多くは両方のCに適用されますおよびC ++、埋め込まれた二重アンダースコアのルールはC ++であるものののみ、この回答の一番上に述べたようにます。

他のヒント

名をダブル主アンダースコアを使用しては予約により使用を実施します。このない社内体がしばしばです。

のアイデアはいません使用の名前から __, の実装が無料に使ってもらうような場所でマクロ-拡張、または、名前の構文の拡張子(例えば __gcnew の一部ではなく、C++でもMicrosoftに追加できますC++/CLI自信がない既存のコードがい int __gcnew; ここにまとめられるというメリットの編集).

うのか、これらの特定の拡張子を意味する __const きていただく必要のあるドキュメンテーションに特定のコンパイラ/トセット。この特定の場合は、その試作をドキュメント(例: http://www.kernel.org/doc/man-pages/online/pages/man3/ether_aton.3.html することによって、これらの機能の面を無視する __const__THROW 装飾とはどのように実際のヘッダを表します。

いくつかのライブラリでは慣例で、これは特定のシンボルがライブラリの公開APIの一部であることを意図していない内部使用のためであることを示します。

__constにアンダースコアは、このキーワードは、コンパイラの拡張であり、それを使用して(constキーワードは、以降のリビジョンでCに添加し、89私は思う)、ポータブルではないことを意味します。 __THROWも延長のいくつかの種類ですが、私はそれはGCCが使用されている場合、一部の__attribute __(何か)に定義されますと仮定し、しかし、私はそれに必ずチェックするのが面倒ではないです。 __addrは、それは名前だけだ、プログラマはそれが意味するように望んでいたものを意味することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top