为什么C中的某些函数有下划线前缀?

时间:2016-09-21 19:48:55

标签: c function sockets networking

我最近开始用C学习网络,我看到一些以下划线开头的函数_function() - 这究竟是什么意思?我也看到了这个:

$db_host = "localhost";
$db_username = "root";
$db_pass = "";
$db_name = "omicrome";

@mysql_connect("$db_host","$db_username","$db_pass") or die ("could not connect to mysql");
@mysql_select_db("$db_name") or die ("No database");

这部分代码意味着什么:

 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)];  

};

2 个答案:

答案 0 :(得分:16)

下划线前缀保留用于编译器和标准库使用的函数和类型。标准库可以自由使用这些名称,因为它们永远不会与正确的用户程序冲突。

另一方面是不允许您定义以下划线开头的名称。

嗯,这就是规则的要点。实际的规则是:

  • 您无法在名称以下划线开头的全局范围内定义任何标识符,因为这些标识符可能与隐藏(私有)库定义冲突。所以这在您的代码中无效:

    #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
    
  • 您不能在名称以两个下划线开头的任何范围内定义任何标识符,或者在下划线后面跟一个大写字母。所以这是无效的:

    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
    }
    

实际上还有一些规则,只是为了让事情变得复杂,但上面的规则是最常被违反和最容易记住的。

答案 1 :(得分:6)

领先的下划线通常表示以下三种情况之一:

  1. 该定义不属于C标准,因此不可移植
  2. 该定义是库或编译器的内部定义,不应在外部使用
  3. 不应轻易使用该定义,因为它意味着需要额外知识的某些风险或必要配置。
  4. 在这种情况下,__SOCKADDR_COMMON是(2):内部定义,是struct sockaddr_in类型的一部分,是您通常从用户区访问的类型。