【问题标题】:Why don't win32 API functions have overloads and instead use Ex as suffix?为什么win32 API函数没有重载,而是使用Ex作为后缀?
【发布时间】:2010-12-21 13:51:17
【问题描述】:

例如,win32 API 有两个方法 StrFormatByteSize 和 StrFormatByteSizeEx。 即使这两种方法在语义上都做同样的事情,而 Ex 计数器部分只提供了一个新参数来稍微改变行为,那么它们不能有两个相同函数的重载吗?

这是 c/c++ 的限制,还是这种尴尬约定的可能原因是什么?

【问题讨论】:

  • C/C++ 不是一种语言。 Windows API 是 C API。

标签: c++ c architecture winapi


【解决方案1】:

Win32 API 是 C(不是 C++)API。 C 语言不支持重载函数。


除了完整之外:Win32 API 使用__stdcall 修饰的函数,其中包括参数的字节数作为函数名的一部分。 __stdcall 不是 C 语言的一部分,但 Windows 链接器必须知道它。

微软可以使用它来实现某种重载,但是(因为很多语言不理解重载)这将限制可用于程序窗口。

【讨论】:

  • __stdcall 不是 C 语言的一部分。 C 语言不支持重载函数,句号。如果没有第二段,你的答案会更好、更正确。
  • @jalf:没错,但由于 __stdcall 是 Win32 API 的一部分,您可以将它用于有限的重载。这将是一个非常糟糕的主意。我已经扩展了我原来的内容以澄清这一点。
【解决方案2】:

C 语言根本不支持函数重载。

【讨论】:

    【解决方案3】:

    这是 c/c++ 的限制,还是这种尴尬约定的可能原因是什么?

    是的,C 不支持重载函数的原因是,用于标准 C 的名称修改(链接器使用的函数名称的转换)不考虑其函数参数。
    IE。 C 中的void func(int) 被修改为_func 所以你不能同时拥有func(int)func(bool),因为两者都将转换为_func

    而在 C++ 中,函数的重命名会考虑其所有函数参数,但由于 C++ 中的名称重整未标准化,因此名称重整取决于编译器。

    要记住的另一件事是 C++ 不考虑函数名中的函数的返回参数。因此,不能同时拥有 void func(int)bool func(int) 这样的重载函数。

    --萨姆拉特·帕蒂尔

    【讨论】:

    • 我会说这是相反的 - 名称修改不考虑(也不必考虑)函数参数的原因是 C 不支持重载。在 1980 年,C 语言是其实现的结果,但在 2009 年,C 实现是语言标准的结果。名称修改方案不是标准的一部分,例如 MSVC 将 void func(int) 修改为 _func 用于 cdecl,_func@4 用于 stdcall 和 @func@4 用于 fastcall。
    【解决方案4】:

    微软从不打扰。

    当然,这里有些人说 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++ 重载。

    【讨论】:

    • 但是当 Win32 API 是 C API 并且每个人都可以愉快地使用它时,为什么微软要提供这种东西,然后必须支持和记录它呢?我总是用我自己的 C++ 代码来包装第三方 API 的使用,这些代码处理参数健全性并在失败时抛出异常等,但我对这些情况下正确和正确的看法可能与您的看法大不相同,与 MS 的人大不相同谁必须编写这些垫片。由于我可能仍会包装他们的官方 C++ 垫片,因此我宁愿他们将精力花在更有用的任务上。
    • 它实际上不需要支持/文档​​,因为这将是一个自动转换。
    • 如果存在,则需要支持和文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    相关资源
    最近更新 更多