【问题标题】:C++ compile errors in Unicode Release MinDependency but not in DebugC++ 在 Unicode Release MinDependency 中编译错误,但在 Debug 中没有
【发布时间】:2009-07-31 17:59:01
【问题描述】:

首先让我说我负责创建和管理构建和安装,而且我不是 C++ 开发人员,所以下面的大多数错误对我来说都是不可理解的。

据说开发人员(现在不在身边)签入了一些在 Debug|Win32(使用 VS08)中编译良好的代码,但我需要让它在 Unicode Release MinDependency|Win32 中编译。

有 88 个错误,但似乎都归结为“转换”问题,而且都是下面列出的问题的多次出现。

  • 编译错误是否与它的编码方式(C++、ATL)有关?

  • 是否有一些编译选项开关或 VS 设置我可以更改以使其编译为 MinDep?

  • 是否有简要说明导致此问题的原因以便我了解当前的问题?

错误:

cannot convert from 'unsigned short *' to 'ATL::CComBSTR'
cannot convert from 'wchar_t *' to 'unsigned short *'
cannot convert parameter 1 from 'unsigned short *' to 'wchar_t *'
cannot convert parameter 1 from 'LPWSTR' to 'const unsigned short *'
cannot convert parameter 2 from 'BSTR' to 'const unsigned short *'
cannot convert parameter 2 from 'LPWSTR' to 'const unsigned short *'
none of the 2 overloads could convert all the argument types
cannot convert parameter 1 from 'unsigned short *' to 'const OLECHAR *'
cannot convert parameter 1 from 'unsigned short [4096]' to 'wchar_t *'

【问题讨论】:

    标签: c++ compiler-errors


    【解决方案1】:

    问题是代码写得不好。开发人员对在 Unicode 中编译时不成立的字符和整数类型做出了假设。问题不在于 Visual C++、ATL 或 Visual Studio。

    显然,您可以使用编译器开关来使其编译,因为这可能是 Debug 和 Unicode Release Mindependency 版本之间的主要区别。但是,您不想切换它,因为这意味着您不再执行实际的 Unicode Release Mindependency 构建。

    您会注意到,每条转换消息都介于unsigned short *(指向特定整数类型的指针)和字符串的某种表示之间。在正确编写的 C++ 中,您不会到处在整数类型和字符类型之间进行转换。可能有必要这样做,例如在处理遗留代码时,但这是潜在问题的根源,需要仔细观察。

    您需要重写此代码。您说开发人员不在身边(可能是因为做这样的事情而被解雇?),所以您必须让另一个开发人员来修复它。

    【讨论】:

    • 一些跨平台库使用 unsigned short* 而不是 wchar_t* 来强制特定大小,因为 sizeof(wchar_t) 可以是 2 到 4 个字节,具体取决于编译器和设置。我认为 Qt 做到了。使用这些库中的字符串,当编译标志不兼容时,wchar_t 会导致类似的错误。
    • 谢谢。我想这意味着应该有明确的转换函数。
    • 不,这通常是通过使用正确的编译标志和检查来处理的(很难做到,因为其他依赖项可能使用 wchar_t)
    【解决方案2】:

    在 Visual Studio IDE(此处假定为 2008)中有几个地方可以检查在调试和发布版本中是否具有相同的设置:

    项目属性->常规->字符集(设置为使用Unicode字符集)

    项目属性 -> C/C++ -> 语言 -> 将 wchar_t 视为内置类型(通常设置为 Yes)

    项目属性 -> C/C++ -> 命令行 - 你应该看到定义了 UNICODE 和 _UNICODE

    如果这些设置在两个版本中都相同 - 它可能会变得更糟,因为条件编译可能会发生这种情况,这取决于他正在使用的特定库或他的代码。

    您可以在此处阅读http://msdn.microsoft.com/en-us/library/xt153e2k(VS.71).aspx,了解 MinDependency 的含义。它实际上是 ATL 关于如何链接 crt 的定义。

    请注意 wchar_t 被定义为 unsigned short - 所以它只是缺少那里的定义 - 不是上面所说的实际转换错误。我没有 VC 6 来测试它,但在 VC9 下它是这样的:

    #ifndef _WCHAR_T_DEFINED
    typedef unsigned short wchar_t;
    #define _WCHAR_T_DEFINED
    #endif
    

    【讨论】:

      【解决方案3】:

      这些错误看起来都与字符串相关。有人可能在发布模式下的调试模式下启用/禁用了 unicode 和/或宽字符串。尝试在 Visual Studio 的发布模式设置中翻转这些设置,看看它是否可以编译。或者,检查 Release 和 Debug 模式之间的所有设置是否匹配。

      【讨论】:

      • 阅读问题——他需要构建两种不同的模式,并且只能构建一种。
      • 更新为更明确地说模式。我只是假设默认情况下其他开发人员在 Release 模式下构建,而他在 Debug 中构建,所以我认为不需要明确说明。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      相关资源
      最近更新 更多