【问题标题】:error C2733 second C linkage of overloaded function 'function' not allowed错误 C2733 不允许重载函数“函数”的第二个 C 链接
【发布时间】:2011-12-12 00:24:03
【问题描述】:

我正在尝试在 Visual Studio 2010 pro 中编译旧的 cpp MFC 项目。

它使用使用 Labview 编译的 dll,我正在添加此信息,因为我不知道是什么导致了错误消息..

错误消息显示在多个函数上,所有错误类型都相同。

error C2733: second C linkage of overloaded function 'function name' not allowed.

“函数名”包括:“StrCatW”、“StrCmpNW”、“StrCmpW”、“StrCpyNW”和“StrCpyW”

我在网上找到了similar case

虽然链接中的建议在我的情况下没有解决,但我仍然看到相同的错误消息。

提前感谢任何试图提供帮助的人。

【问题讨论】:

  • 看起来像函数StrCatW, 'StrCmpNW, etc. are either linked more than once or they are include in more than one file *without* being declared as inline`。
  • @ThomasMatthews 这个错误并不是说同一个函数有多个定义,而是说有多个同名的重载。在这种情况下的问题是,由于 C 链接,名称修饰被禁用,并且您不能必须使用完全相同名称的符号来引用不同的函数。

标签: c++ c visual-studio-2010 visual-c++


【解决方案1】:

我没有使用 MFC 的经验,无论如何我会尝试回答。 当使用一组不同的参数声明 extern "C" 函数时,会出现此类错误消息。例如:

extern "C" int myfunc(int);
extern "C" int myfunc(char);

在你的情况下,这两个声明可能与char*有关:

extern "C" char* StrCatW(char*, char*);
extern "C" wchar_t* StrCatW(wchar_t*, wchar_t*);

尝试在您的解决方案中关闭 Unicode 支持:我猜,如果 dll 真的很旧,它会以某种方式声明 StrCatWchar* 参数,与其他声明冲突。

如果这没有帮助,打开预处理输出(/E 编译器开关,据我记得) - 它会输出一个非常大的文件,所以在其中寻找 StrCatW,也许它会给你关于发生了什么的一些线索。

【讨论】:

  • 感谢您的建议.. 关闭了 Unicode 支持并且没有工作,所以我将尝试预处理输出,看看发生了什么
  • 嗨,当我打开预处理(VS 2010 中的 /P)时,我看到 LINK 错误要求 stdafx.obj,这是我的源文件列表中第一个 cpp 的 obj 文件。我发现 MSDN 错误解释似乎与您的建议有关.. msdn.microsoft.com/en-us/library/5z9es6ec(v=vs.71).aspx
  • 我只是通过从头文件中注释掉错误“第二个 C 链接”列表中的函数来解决问题
  • 在我的情况下,错误是因为我在头文件中将我的 DLL 中的函数声明为 extern "C" {DECLDIR void GetSetFrameFunctionPointers( void (*myfunc)(int i) );} 并在 cpp 文件中将其实现为 extern "C" {DECLDIR void GetSetFrameFunctionPointers( void (*myfunc)() );}int i 丢失了,这导致了错误。
  • 是的,我想这也属于 David Rodríguez - dribeas 在第一个线程上评论的类别。在您的情况下,我假设 C/C++ 将无参数函数视为有效但是仍然会产生错误,因为在 C 链接中禁用了名称修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
相关资源
最近更新 更多