【问题标题】:Conversion between const wchar_t* and const char*, not allowed using qtconst wchar_t* 和 const char* 之间的转换,不允许使用 qt
【发布时间】:2017-03-03 01:30:12
【问题描述】:

我正在尝试将库 simplexlsxwriter 与 Qt 一起使用,但是当我尝试编译时,我在代码中的多个位置遇到了以下错误:

“无法将参数 '1' 的 'const TCHAR* {aka const wchar_t*}' 转换为 'const char*' 到 'size_t strlen(const char*)'”

有问题的行是:

bool HasZipSuffix(const TCHAR *fn) { 
    const TCHAR *ext = fn+_tcslen(fn);
}

为了消除错误,我尝试了以下方法:

bool HasZipSuffix(const TCHAR *fn) { 
    const char* fn_cc = reinterpret_cast<const char*> (fn);
    const TCHAR *ext = fn+_tcslen(fn_cc );
}

它可以工作,但是在编译过程中会引入很多错误(大约 3720 个问题)。我在Qt下使用mingw53_32。

这很奇怪,因为当我创建一个简单的 Makefile 如下:

ROOT_DIR := ./

CXXFLAGS=-MMD -MP -Wall
CXXFLAGS+= -I$(ROOT_DIR)

src = Zip/zip.cpp \
    Xlsx/Chartsheet.cpp \
    Xlsx/Workbook.cpp \
    Xlsx/Worksheet.cpp \
    Xlsx/XlsxHeaders.cpp \
    main.cpp 

includes = Zip/zip.h \
    tchar.h \
    Xlsx/Chartsheet.h \
    Xlsx/SimpleXlsxDef.h \
    Xlsx/Workbook.h \
    Xlsx/Worksheet.h \
    Xlsx/XlsxHeaders.h

object=$(src:.cpp=.o)

%: %.o
    $(LINK.cpp) -o $@ $^ $(LDFLAGS)

main: $(object)

-include $(src:.cpp=.d)

编译没有遇到任何困难,我获得了所需的二进制文件。所以我的问题是,为什么使用 Qt 从 const wchar_t* 到 const char* 的转换会在使用“原始”mingw 编译器时抛出错误,它不会抛出任何错误?

【问题讨论】:

  • 有一些函数可以实际转换底层数据,但不能只在二进制级别不同的事物之间重新解释转换。
  • 我不应该在这个问题中添加 reinterpret_cast 的东西,因为它更关注原因,为什么从 const wchar_t*const char* 的转换不会使用 mingw32 引发任何错误(使用 gcc 版本5.3) 但是当我使用 Qt 使用相同的编译器时会引发错误?
  • @SchneiderLoïc:Qt 是一条红鲱鱼。它只是一个图书馆。您很可能还有其他编译器标志。

标签: c++ qt wchar-t


【解决方案1】:

只需添加

DEFINES -= UNICODE 

.pro 文件。 qmake 默认定义-DUNICODE,与win32 库冲突。

【讨论】:

    猜你喜欢
    • 2015-08-05
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多