我最近开始用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)];
};
答案 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)
领先的下划线通常表示以下三种情况之一:
在这种情况下,__SOCKADDR_COMMON
是(2):内部定义,是struct sockaddr_in
类型的一部分,是您通常从用户区访问的类型。