我想有以下方法作为任何阵列的通用方法,为什么C++禁止没有类型的参数声明?
int arrayLength(`anyType` array[])
{
return sizeof(array)/sizeof(array[0]);
}
但是似乎C++不允许类型的任何含糊之处可言,
这是为什么,以及如何我应该着手解决吗?
我想有以下方法作为任何阵列的通用方法,为什么C++禁止没有类型的参数声明?
int arrayLength(`anyType` array[])
{
return sizeof(array)/sizeof(array[0]);
}
但是似乎C++不允许类型的任何含糊之处可言,
这是为什么,以及如何我应该着手解决吗?
因为类型必须推入堆栈然后弹出,sizeof
一种类型不等于sizeof
另一种类型。
如果在函数之间堆栈上传递的类型的大小不是固定的或者是事先不知道的,编译器如何编译一个函数?
正如其他人已经注意到的那样,这个问题的解决方案是模板和宏,它们都动态生成代码 - 然后在编译时编译 - 看起来像“求解“的问题,但实际上只是通过将工作卸载到编译器上来消除或分散您的注意力。
在Visual C++中,有一个__countof()
结构可以实现相同的功能。它被实现为C++编译模板,并作为C的宏实现。如果在指针上使用C++版本的错误(与真正的数组相反),C版本不会。
我想你真正要问的是“为什么C++坚持静态类型?”
答案:因为如果语言使用静态类型,编写能够生成小型快速程序的编译器会更容易。这就是C++的目的:创建小型,快速的程序,如果用C编写,其复杂性将是相对难以管理的。
当我说“小”时,我包含任何所需运行时库的大小。
'template std :: size_t arrayLength(T(&)[N]){return N; }' –
ildjarn
Duplicate:http://stackoverflow.com/questions/4415524/common-array-length-macro-for-c –
另一个相关的线程:http://stackoverflow.com/questions/95500/can-this-macro被转换成函数 – Troyseph