在我的研究中,我读过C不支持重载。但是,此应用程序使用的是C ++,而不是C.我还 无法修改 stdio.h。当我尝试将在Visual Studio 2003中编写的应用程序/项目移动到Visual Studio 2010时,会创建错误。
我收到了错误:
错误C2733:重载函数的第二个C链接' _tempnam_dbg'不允许c:... \ stdio.h
和
错误C2733:重载函数的第二个C链接' _wtempnam_dbg'不允许c:... \ include \ stdio.h
导致相应错误的代码:
_Check_return_ _CRTIMP char * __cdecl _tempnam(_In_opt_z_ const char * _DirName, _In_opt_z_ const char * _FilePrefix);
...
_Check_return_ _CRTIMP wchar_t * __cdecl _wtempnam(_In_opt_z_ const wchar_t * _Directory, _In_opt_z_ const wchar_t * _FilePrefix);
我已经从this SO solution读到了"当外部' C'函数声明了一组不同的参数。" 。
的编辑:
这就是说,这是我的解决方案中唯一包含tempnam
和wtempnam
的内容的区域。
答案 0 :(得分:3)
由于您使用的是C ++而不是C,因此您应该#include <cstdio>
而不是#include <stdio.h>
。 Simiarly for stdlib,stdarg,string,math,errno,stdint等。那些具有在C ++中正常工作的适当声明。
答案 1 :(得分:2)
首先,stdio.h是C而不是C ++的一部分,因此其中包含的任何内容都可能在extern "C"
之间,这意味着C符号不会被破坏,因此无法进行函数重载。
在C ++中,函数重载使用名称修改(基于名称和参数列表)来工作,所以如果你在两个地方声明了_tempnam(const char*, const char*)
,它仍然无法工作,因为参数列表是相同的。< / p>
查找C ++名称修改。
https://en.wikipedia.org/wiki/Name_mangling
看起来tempnam只是微软的一个功能。 https://msdn.microsoft.com/en-us/library/hs3e7355.aspx
因为我只能在C标准库中找到tmpnam。 http://en.cppreference.com/w/c/io/tmpnam