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

Second C Linkage of Overloaded Function for a Standard Library stdio.h

在我的研究中,我了解到 C 不支持重载。但是,这个应用程序使用的是C++,而不是C。我也无法修改stdio.h。当我试图将在 Visual Studio 2003 年编写的 application/project 移动到 Visual Studio 2010 年时出现错误。

我收到错误:

error C2733: second C linkage of overloaded function '_tempnam_dbg' not allowed c:...\stdio.h

error C2733: second C linkage of overloaded function '_wtempnam_dbg' not allowed 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 那里读到 "Such error message appears when an extern 'C' function is declared with a different set of parameters."
已编辑: 话虽如此,这是我的解决方案中唯一包含有关 tempnamwtempnam.

的区域

首先,stdio.h 是 C 而不是 C++ 的一部分,因此其中包含的任何内容都可能介于 extern "C" 之间,这意味着 C 符号不会被破坏,因此函数重载是不可能的。

在 C++ 中,函数重载使用名称修饰(基于名称和参数列表)来工作,因此如果您在两个地方声明了 _tempnam(const char*, const char*),它仍然无法工作,因为参数列表是相同的.

查找 C++ 名称修改。

https://en.wikipedia.org/wiki/Name_mangling

另外,tempnam 似乎是 Microsoft 独有的功能。 https://msdn.microsoft.com/en-us/library/hs3e7355.aspx

因为我只能在C标准库中找到tmpnam。 http://en.cppreference.com/w/c/io/tmpnam

由于您使用的是 C++ 而不是 C,因此您应该 #include <cstdio> 而不是 #include <stdio.h>。与 stdlib、stdarg、string、math、errno、stdint 等类似。这些具有在 C++ 中正常工作的正确声明。