这个函数定义如何工作?
我几天前用gperf
生成了一个哈希函数。 我看到hash
函数对我来说是陌生的。 它是这样的(我不记得确切的语法):
unsigned int hash(str, size) register char* str; register unsigned int size; { //Definition }
现在,当我尝试使用C ++编译器(g ++)进行编译时,由于没有声明str
和size
因此向我提出错误。 但这是在C编译器(gcc)上编译的。 所以,问题:
- 我认为C ++是C的超集。如果是这样的话,这应该用C ++编译器编译吧?
- C编译器如何理解定义?
str
和size
在首次出现时未声明。 - 在函数签名之后但在函数体之前声明
str
和size
的目的是什么,而不是遵循在两个地方中的任何一个中执行它的正常方法? - 如何在g ++上编译此函数,以便在C ++代码中使用它? 或者我应该尝试从gperf生成C ++代码? 那可能吗?
1. C ++不是超集,虽然这也不是标准C.
2/3。 这是一个K&R函数声明。 请参阅ANSI C和K&R C之间的主要区别是什么? 。
4.实际上,gperf确实有一个选项-L
来指定语言。 您可以使用-L C++
来使用C ++。
某些编译器仍然支持声明函数正式参数的旧C语法。
例如
int func (x) int x { }
是用于定义函数的旧样式(K&R样式)语法。
我认为C ++是C的超集。如果是这样的话,这应该用C ++编译器编译吧?
Nopes! C ++不是C的超集。函数声明/定义的这种风格(语法)曾经是C的一部分,但从未成为C ++的一部分。 所以它不应该用C ++编译器编译。
这似乎是“老派”C代码。 在括号之外但在代码块的开放式curl括号之前声明参数的类型是C编程早期的遗留物(我不知道为什么,但我想它与变量管理有关堆栈和/或编译器设计)。
回答你的问题:
-
将C ++称为C的“超集”有点用词不当。 虽然它们共享基本的语法function,并且您甚至可以使用C ++进行各种C库调用,但它们在类型安全性,警告与错误(C更允许)以及编译器/预处理器选项方面存在显着差异。
-
大多数现代C编译器都了解遗留代码(例如这似乎是)。 C编译器将函数参数名称类似于“占位符”,直到它们的类型可以紧跟函数头名称后声明。
-
没有真正的“目的”,除了再次,这似乎是古老的代码,并在当天的风格是这样的。 “正常”方法是IMO更好,更直观的方式。
-
我的建议:
unsigned int hash(register char * str,register unsigned int size){//定义}
建议:考虑放弃register
关键字 – 这在旧C程序中用作指定变量将存储在内存寄存器中的方式(为了提高速度/效率),但现在编译器更好地优化了这个需求。 我相信现代编译器会忽略它。 此外,您不能在register
变量上使用C / C ++中的&
(地址)运算符。