标准库stdio.h的重载函数的第二个C链接

时间:2015-07-21 17:41:29

标签: c++ c overloading linkage

在我的研究中,我读过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'函数声明了一组不同的参数。"
编辑: 这就是说,这是我的解决方案中唯一包含tempnamwtempnam的内容的区域。

2 个答案:

答案 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