LPCSTR 和 wchar_t 问题。由于参数不匹配导致的链接器错误

LPCSTR and wchar_t issue. Linker error because of parameter mismatch

我将大量代码从 Visual Studio 移植到启用了 mingw unicode 的项目,我 运行 到这个 issue.It 似乎我从派生 class 与基数 class 不匹配。至少那是我的假设。我怀疑问题出在类型 LPCSTR 在 mingw 中查看此类型时,我得到以下 typedef

  typedef CONST CHAR *LPCSTR,*PCSTR;

现在这是基础class

#ifdef UNICODE
    CBasePin(
        __in_opt LPCSTR pObjectName,        
        __in CBaseFilter *pFilter,     
        __in CCritSec *pLock,           
        __inout HRESULT *phr,              
        __in_opt LPCWSTR pName,        
        PIN_DIRECTION dir);         
#endif

这是继承基class并将参数传递给基class的class。

CAsyncOutputPin::CAsyncOutputPin(
    HRESULT * phr,
    CAsyncReader *pReader,
    CAsyncIo *pIo,
    CCritSec * pLock)
  : CBasePin(
                TEXT("Text Pin"), 
                pReader,
                pLock,
                phr,
                TEXT("Output"), 
                PINDIR_OUTPUT
            ),

    m_pReader(pReader),
    m_pIo(pIo)
  ,m_bQueriedForAsyncReader(false)  ////
{
}

这是我在构造函数初始化列表中遇到的链接器错误

undefined reference to `CBasePin::CBasePin(wchar_t const*, CBaseFilter*, CCritSec*, long*, wchar_t const*, _PinDirection)'|

关于我为什么会收到此链接器错误的任何建议。我对为什么这是一个链接器错误感到有点困惑。我在猜测它是否是类型不匹配或者它会显示为编译器错误的原因。关于如何解决 Mingw 64 位 gcc 的这个问题有什么建议吗?

你的 CBasePin 有一个参数 LPCSTR pObjectName(属于 const char* 类型)和一个参数 LPCWSTR pName(属于 const wchar_t* 类型)并且在你对它的调用中你在字符文字上使用 TEXT-macro,所以当定义 UNICODE 时,这两个文字都获得了 L 前缀,使它们成为 const wchar_t*,所以有是 pObjectName 上的类型不匹配。 如果未定义 UNICODE 那么您将在 pName 上得到相同的错误。

删除第一个 TEXT,它应该没问题(对于 UNICODE 就是这样)。

为什么要使用 TEXT 宏?您有一个 char * 参数和一个 wchar_t * 参数,它不能对两者都做正确的事情。

写下你的意思。像

"Text Pin", ..., L"Output", ...