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

标签 c function sockets networking

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

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

最佳答案

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

另一方面,您不能定义以下划线开头的名称。

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

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

    #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
    }
    

其实还有一些规则,只是为了把事情复杂化,但上面的规则是最常被违反的,也是最容易记住的。

关于c - 为什么C中的一些函数有下划线前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39625352/

相关文章:

c - 为什么在下面的示例中循环不会无限运行?

python - Python 或 C 中的康托三元集

使用 "..."选择枚举元素

php - 在 PHP/MySQL 注销表单中围绕 session 变量包装函数

javascript - 函数未运行/未正确调用

c++ - 没有函数指针参数的隐式向上转换?

c# - 来自 Xamarin 应用程序的第二次 api 调用失败(第一次调用总是返回正常)

C字符串连接问题函数

java - 如何保持Socket连接?

linux - 如何将 fd 传递给另一个进程?