Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不';win32 API函数有重载,而使用Ex作为后缀?_C++_C_Architecture_Winapi - Fatal编程技术网

C++ 为什么不';win32 API函数有重载,而使用Ex作为后缀?

C++ 为什么不';win32 API函数有重载,而使用Ex作为后缀?,c++,c,architecture,winapi,C++,C,Architecture,Winapi,例如,win32 API有两种方法StrFormatByteSize和StrFormatByteSizeEx。 即使这两个方法象征性地做相同的事情,并且Ex-counter部分只提供了一个新参数来稍微改变行为,那么它们不能有相同函数的两个重载吗 这是c/c++的局限性,还是造成这种尴尬惯例的可能原因?Win32 API是c(而不是c++)API。C语言不支持重载函数 旁白:Win32 API使用\uu stdcall修饰函数,其中包括作为函数名一部分的参数字节数\uu stdcall不是C语言

例如,win32 API有两种方法StrFormatByteSize和StrFormatByteSizeEx。 即使这两个方法象征性地做相同的事情,并且Ex-counter部分只提供了一个新参数来稍微改变行为,那么它们不能有相同函数的两个重载吗

这是c/c++的局限性,还是造成这种尴尬惯例的可能原因?

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


旁白:Win32 API使用
\uu stdcall
修饰函数,其中包括作为函数名一部分的参数字节数<代码>\uu stdcall不是C语言的一部分,但是Windows链接器必须知道这一点


微软可以用它来实现某种重载,但是(因为许多语言不理解重载),这将限制可用于编程Windows的语言数量。

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

这是c/c++的一个局限性,还是造成这种尴尬惯例的可能原因

是的,C不支持重载函数的原因是,用于标准C的名称损坏(链接器使用的函数名转换)不考虑其函数参数。
例如,C中的
void func(int)
被损坏为
\u func
因此,不能同时使用
func(int)
func(bool)
,因为两者都将转换为
\u func

<> P>而C++中,函数的名称会影响函数的所有参数,但由于C++中的名称不规范,名称的修改是依赖于编译器的。 请记住,C++在函数名中没有考虑函数的返回参数。因此,不能同时使用
void func(int)
bool func(int)
等重载函数


--萨姆拉特·帕蒂尔(Samrat Patil)

微软从未为此烦恼过

当然,这里有一些人说C不支持重载。那无关紧要。API已经使用了C风格的重载。例如,您提到的
StrFormatByteSize
函数实际上有两个重载:
LPSTR StrFormatByteSizeA(DWORD dw、LPSTR pszBuf、UINT cchBuf)
LPWSTR StrFormatByteSizeW(LONGLONG qdw、LPWSTR pszBuf、UINT cchBuf)。当然,这种机制的问题在于,它对各种后缀的概括能力很差


<>微软可以添加一个头,它提供了<代码> StrutAtByTestI/<代码>作为两个内联C++函数,而不是C宏。如果他们这样做了,那么为_Ex后缀添加第三个重载就很容易了。没有这样的C++头,因此没有C++重载。

C语言不支持重载函数,句号。如果没有第二段,您的答案会更好、更正确。@jalf:True,但由于u stdcall是Win32 API的一部分,您可以使用它进行有限的重载。这真是个坏主意。为了澄清这一点,我将我的原稿放在一边,我认为这是另一种方式——名称损坏不考虑(也不必考虑)函数参数的原因是C不支持重载。1980年,C语言是其实现的结果,但在2009年,C实现是语言标准的结果。名称篡改方案不是标准的一部分,例如,对于cdecl,
_func@4
用于stdcall和
@func@4
for fastcall.C/C++不是一种语言。Windows API是一个C API。但是为什么微软要提供这种东西,然后必须支持和记录它,而Win32 API是一个C API,每个人都可以很高兴地使用它呢?我总是用我自己的C++代码包第三方API使用来处理参数的健全性,并在失败等方面抛出异常,但是我对这些情况下的正确和正确的看法可能与你的不同,与那些不得不编写这些垫片的MS的人非常不同。因为我可能仍然会包装他们的官方C++ SHIMS,我宁愿他们把精力消耗在更有用的任务上。实际上,这不需要支持/文档,因为这是一个自动的转换。如果存在,它需要支持和文档。