2016-09-21 4 views
4

最近C言語でのネットワークの学習を始めましたが、_function()のようなアンダースコアで始まるいくつかの関数がありました。また、私はこれを見た:C言語の関数の中にアンダースコアがあるのはなぜですか?

struct sockaddr_in { 

__SOCKADDR_COMMON (sin_); 

in_port_t sin_port;  

struct in_addr sin_addr;  

unsigned char sin_zero[sizeof (struct sockaddr) - 

__SOCKADDR_COMMON_SIZE - 

sizeof (in_port_t) -   

sizeof (struct in_addr)]; 

}; 

コードのこの部分はどういう意味:

__SOCKADDR_COMMON (sin_); 

unsigned char sin_zero[sizeof (struct sockaddr) - 

__SOCKADDR_COMMON_SIZE - 

sizeof (in_port_t) -   

sizeof (struct in_addr)]; 
+0

アンダースコアで始まる名前の件名についてC標準を引用している[Cでは二重アンダースコア( '__const')の意味は何ですか?](http://stackoverflow.com/questions/1449181/) –

答えて

7

アンダースコアプレフィックスは、コンパイラと標準ライブラリで使用される関数と型のために予約されています。標準ライブラリは、正しいユーザープログラムと競合しないため、これらの名前を自由に使用できます。

反対側には、アンダースコアで始まる名前を定義することはできません。

これはルールの要点です。実際のルールはこれです:これらは、隠された(プライベート)ライブラリ定義と競合する可能性があるため

  • あなたは、名前にアンダースコアで始まるグローバルスコープ内の任意の識別子を定義することはできません。だから、これはあなたのコードでは無効です:

    #ifndef _my_header_h_ 
    #define _my_header_h_ // wrong 
    int _x; // wrong 
    float _my_function(void); // wrong 
    #endif 
    

    しかし、これは有効です。

    #ifndef my_header_h 
    #define my_header_h // ok 
    int x; // ok 
    float my_function(void) { // ok 
        int _x = 3; // ok in function 
    } 
    struct my_struct { 
        int _x; // ok inside structure 
    }; 
    #endif 
    
  • あなたが名前資本続く2つのアンダースコア、または1アンダースコアで始まる任意の範囲内の任意の識別子を定義することはできません文字。

    struct my_struct { 
        int _Field; // Wrong! 
        int __field; // Wrong! 
    }; 
    void my_function(void) { 
        int _X; // Wrong! 
        int __y; // Wrong! 
    } 
    

    しかし、これは大丈夫です::だから、これは無効です

    struct my_struct { 
        int _field; // okay 
    }; 
    void my_function(void) { 
        int _x; // okay 
    } 
    

があり、さらにいくつかのルールは、物事を複雑にするために、実際にはありますが、上記のものは、最も頻繁に違反しています覚えておくと一番簡単です。

+0

ありがとうございます。コードのこの部分では、__SOCKADDR_COMMON(sin_); (sin_)の意味は何ですか? –

+1

これはライブラリの仕組みの実装の詳細の一部ですが、それは本当に重要ではありません。この特定のケースでは、おそらく共通のソケットフィールド名を構築するために使用される接頭辞なので、 'struct sockaddr_in'には' sin_family'、 'struct sockaddr_un'には' sun_family'を取得します。これは私が信じていることは、歴史的な奇妙なものでも、マクロを使ってヘッダフィールドを定義する余裕かもしれないと思います。 –

+0

助けてくれてありがとう –

2

大手が浮き彫りに通常3つのものの一つを示している:

  1. 定義はの一部ではありませんCの標準であるため、移植性がありません。
  2. この定義はライブラリやコンパイラの内部であり、外部から使用しないでください。
  3. この定義は、余分な知識を必要とするリスクや必要な設定が含まれているため、軽く使用しないでください。この場合

__SOCKADDR_COMMON(2)です:あなたは、通常、ユーザーランドからアクセス一つである内部の定義、struct sockaddr_inタイプの一部、。

関連する問題