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

Posted

技术标签:

【中文标题】LPCSTR 和 wchar_t 问题。由于参数不匹配导致的链接器错误【英文标题】:LPCSTR and wchar_t issue. Linker error because of parameter mismatch 【发布时间】:2015-04-06 21:37:39 【问题描述】:

我将大量代码从 Visual Studio 移植到启用 mingw unicode 的项目中,我遇到了这个问题。我从派生类传递到基类的参数似乎不匹配。至少这是我的假设。我怀疑问题出在LPCSTR 类型上

  typedef CONST CHAR *LPCSTR,*PCSTR;

现在这是基类

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

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

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 64bit gcc 解决此问题的任何建议?

【问题讨论】:

【参考方案1】:

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

删除第一个 TEXT 应该没问题(对于 UNICODE 来说)。

【讨论】:

【参考方案2】:

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

只要写下你的意思。类似的东西

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

【讨论】:

以上是关于LPCSTR 和 wchar_t 问题。由于参数不匹配导致的链接器错误的主要内容,如果未能解决你的问题,请参考以下文章

C++求助[Error]cannot convert 'const wchar_t*' to 'LPCSTR aka const char*

关于wchar_t类型的输出

wchar_t到QString的转换方法?

CString 如何转为wchar_t

ANSI与Unicode编码,TCHAR | LPSTR | LPCSTR | LPWSTR | LPCWSTR | LPTSTR | LPCTSTR 的含义

为啥 OPENFILENAME lpstrFileTitle 参数是 LPSTR 而不是 LPCSTR?