首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么C中的一些函数有下划线前缀?

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

Stack Overflow用户
提问于 2016-09-22 03:48:55
回答 2查看 14.2K关注 0票数 13

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

代码语言:javascript
复制
 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)];  

};

这部分代码是什么意思:

代码语言:javascript
复制
__SOCKADDR_COMMON (sin_);

unsigned char sin_zero[sizeof (struct sockaddr) - 

 __SOCKADDR_COMMON_SIZE -  

sizeof (in_port_t) -         

sizeof (struct in_addr)];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-22 03:57:32

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

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

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

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

#ifndef _my_header_h_ #定义_my_header_h_ //错误的int _x;//错误的float _my_function(_my_function);//错误的#endif

但这是有效的:

#ifndef my_header_h #定义my_header_h // ok int x;// ok float my_function(My_function){ // ok int _x = 3;// ok in function } struct my_struct { int _x;// ok inside structure };#endif

  • 您不能在名称以两个下划线或一个下划线后跟大写字母的任何作用域中定义任何标识符。所以这是无效的:

结构my_struct { int _Field;//错误!int __field;//错误!};void my_function(void) { int _X;//错误!int __y;//错误!}

但这是可以的:

结构my_struct { int _field;// _x };void my_function(void) { int _x;// _x }

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

票数 22
EN

Stack Overflow用户

发布于 2016-09-22 03:55:43

前导下划线通常表示以下3种情况之一:

  1. 该定义不是C标准的一部分,因此它不可移植
  2. 该定义是库或编译器的内部定义,不应从
  3. 外部使用该定义不应掉以轻心,因为它意味着一些风险或需要额外知识的必要配置。

在本例中,__SOCKADDR_COMMON是(2):一个内部定义,是struct sockaddr_in类型的一部分,通常是从userland访问的类型。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39625352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档