win32 API有两个方法StrFormatByteSize和StrFormatByteSizeEx。 尽管两个方法在语义上做同样的事情,并且Ex计数器部分只提供一个新的参数来稍微改变行为,但是它们不能有两个相同函数的重载?
它是c / c ++的限制还是这种尴尬惯例的可能原因是什么?
答案 0 :(得分:26)
Win32 API是一个C(而不是C ++)API。 C语言不支持重载函数。
完全放弃:Win32 API使用__stdcall
- 修饰函数,其中包括作为函数名称一部分的参数字节数。 __stdcall
不是C语言的一部分,但Windows链接器必须知道它。
Microsoft 可以使用它来实现某种重载,但是(因为许多语言不理解重载)会限制可用于编程Windows的语言数量。
答案 1 :(得分:11)
C语言根本不支持函数重载。
答案 2 :(得分:2)
它是c / c ++的限制还是这种尴尬惯例的可能原因是什么?
是的,并且C不支持重载函数的原因是因为,用于标准C的名称修改(链接器使用的函数名转换)不考虑其函数参数。
即C中的void func(int)
被修改为_func
因此,您不能将func(int)
和func(bool)
放在一起,因为两者都会转换为_func
。
在C ++中,函数的受损名称占其所有函数参数,但由于C ++中的名称修改未标准化,因此名称修改与编译器有关。
要记住的另一件事是C ++不考虑修复名称中函数的返回参数。因此,人们不能将void func(int)
和bool func(int)
重叠在一起。
- Samrat Patil
答案 3 :(得分:0)
当然,这里的一些人说C不支持超载。那是无关紧要的。 API已经使用了重载,C风格。例如,您提到的StrFormatByteSize
函数确实有两个重载:LPSTR StrFormatByteSizeA(DWORD dw, LPSTR pszBuf, UINT cchBuf)
和LPWSTR StrFormatByteSizeW( LONGLONG qdw, LPWSTR pszBuf, UINT cchBuf);
。这种机制的问题当然是它对各种_Ex后缀的概括性很差。
Microsoft可能添加了一个标题,它提供StrFormatByteSize
作为两个内联C ++函数,而不是C宏。如果他们这样做,就很容易为_Ex后缀添加第三个重载。但是,没有这样的C ++标头,因此根本没有C ++重载。