我最近开始用 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/