为什么win32 API函数没有重载,而是使用Ex作为后缀?

时间:2009-11-30 09:03:10

标签: c++ c architecture winapi

win32 API有两个方法StrFormatByteSize和StrFormatByteSizeEx。 尽管两个方法在语义上做同样的事情,并且Ex计数器部分只提供一个新的参数来稍微改变行为,但是它们不能有两个相同函数的重载?

它是c / c ++的限制还是这种尴尬惯例的可能原因是什么?

4 个答案:

答案 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 ++重载。