2015-07-21 108 views
2

在我的研究中,我讀過C不支持重載。但是,這個應用程序是使用C++而不是C。我也是不能修改 stdio.h。當我試圖移動被寫入在Visual Studio 2003到Visual Studio應用程序/項目創建錯誤2010標準庫的重載函數的第二個C鏈接stdio.h

我收到錯誤:重載函數的第二個C鏈接:

錯誤C2733 '_tempnam_dbg' 不允許C:... \ stdio.h中

錯誤C2733:重載函數 '_wtempnam_dbg' 不允許的C第二C鏈接:... \包括\ 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讀到,當一個extern‘C’功能與不同的聲明出現「這樣的錯誤消息參數集「。
編輯: 這就是說,這是我的解決方案中唯一包含關於tempnamwtempnam的任何內容的區域。

+2

「我只能在我的整個解決方案中找到這個函數的一個聲明」 - 如果你可以在你自己的代碼中找到這些函數的任何聲明,那麼這可能是一個錯誤。您應該完全依賴標準庫中用於聲明函數的標準頭文件。 –

+0

你想編譯一個'.cpp'文件以外的文件嗎?從我在網上可以找到的信息來看,你認爲這是一個C錯誤而不是C++。另外,如果沒有充分的理由,您不應該重新定義標準庫中的函數。這肯定會導致問題。 –

+0

請原諒我,因爲我之前說「我只能找到這個函數的一個聲明」時我不正確。顯示的代碼是我能找到的唯一相關代碼,取自stdio.h –

回答

2

首先,stdio.h是C而不是C++的一部分,所以包含在內的任何內容可能都在extern "C"之間,這意味着C符號不會被破壞,因此函數重載是不可能的。

在C++中,函數重載使用名稱修改(基於名稱和參數列表)來工作,所以如果您在兩個地方聲明瞭_tempnam(const char*, const char*),它仍然無法工作,因爲參數列表相同。

查找C++名稱mangling。

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

2

由於您使用的是C++而不是C,因此您應該使用#include <cstdio>而不是#include <stdio.h>。同樣適用於stdlib,stdarg,字符串,數學,errno,stdint和其他。那些有正確的聲明在C++中正常工作。