【问题标题】:c++ 'CA2W': identifier not found [closed]c ++'CA2W':找不到标识符[关闭]
【发布时间】:2011-04-23 09:01:43
【问题描述】:

为什么我会得到“CA2W”:找不到标识符

for(DWORD i = 0; i < numMaterials; i++)    // for each material...
    {
        material[i] = tempMaterials[i].MatD3D;    // get the material info
        material[i].Ambient = material[i].Diffuse;    // make ambient the same as diffuse
        USES_CONVERSION;    // allows certain string conversions
        // if there is a texture to load, load it
        D3DXCreateTextureFromFile(d3ddev,
                                            CA2W(tempMaterials[i].pTextureFilename),
                                            &texture[i]);
        texture[i] = NULL;    // if there is no texture, set the texture to NULL
      }

【问题讨论】:

  • 就像我刚才所说的,你真的需要重新开始学习只是 C++。学习非常好、扎实、干净、基本的 C++,然后向上移动,然后尝试游戏编程。游戏编程并非微不足道,如果您同时尝试学习惯用的 C++,您将无法真正取得任何成果。真的,我想我们都希望看到你变得更好,但我们真的无能为力。在某些时候,您必须自己承担起花时间真正学习基础知识的责任。

标签: c++ visual-c++ winapi


【解决方案1】:

编辑:

OP 刚刚告诉我 Visual Studio 2010 Express 用于编译代码。这可以解释为什么找不到 CA2W,因为 Express 版本不包含整个 ATL/MFC 库。因此,我原来的答案与 OP 无关。

故事的寓意:在提出这类问题时,请务必准确提及您所处的环境。

您可以使用MultiByteToWideChar() 代替CA2W - 这个函数实际上是CA2W 用来转换字符串的函数,因此您将得到基本相同的结果。

Here's a usage example of MultiByteToWideChar() in an answer to another Stack overflow question。是从std::stringLPCWSTR的转换,但过程基本相同。

原答案:

根据the documentation for ATL and MFC String Conversion Macros,您必须包括:
#include <atlbase.h>
#include <atlconv.h>

int main()
{ 
    // Explicitly qualified the CA2W identifier
    ATL::CA2W("Hello World!"); // Test to see if this compiles
} 

我认为此代码 sn-p 之前不起作用的原因是因为您在 #include &lt;atlbase.h&gt; 之前的某个地方#define'd _ATL_NO_AUTOMATIC_NAMESPACE

【讨论】:

  • @Ramiz Toma:是的。您可以使用 Windows SDK 中的 MultiByteToWideChar() 函数。
  • @Ramiz Toma:您可以在 Stack overflow 以及其他网站上找到 MultiByteToWideChar() 的使用示例。如果您在使用该功能时遇到问题,我强烈建议您再问一个问题,这样我的答案就不会乱七八糟了。
  • @Ramiz Toma:这是堆栈溢出时MultiByteToWideChar() 的示例:stackoverflow.com/questions/27220/…
  • @Insilico,您在另一个答案中说,包括atlconv.h 应该就足够了。为什么还要包含atlbase.h?出于某种原因,在我的情况下,我只需要包含后者 - 如果我只包含前者,则代码不会编译。这很奇怪,因为 MSDN says 它位于 atlconv 标头中。
【解决方案2】:

所以试试这个 - 创建一个 Win32 控制台项目,然后用下面的代码替换给定的代码,这对我来说编译得很好。如果这不能为您编译,我很难过 - 也许重新安装 Visual Studio?似乎多人可以正确编译,那么您的 Visual Studio 安装可能有什么问题?

// testconv.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <atlconv.h>
#include <atlbase.h> 
#include <atlstr.h>

int _tmain(int argc, _TCHAR* argv[])
{
   USES_CONVERSION;
   WCHAR *pChar = CA2W(NULL);
    return 0;
}

【讨论】:

    【解决方案3】:

    检查 ATL 头文件 atlconv.hatlbase.h 的路径是否对 Visual Studio 可见

    在您的 monopoly.cpp 文件中,右键单击行 #include &lt;atlconv.h&gt; 并选择 Open document atlconv.h。如果头文件正常打开,则说明该位置没有问题。相反,如果它抛出错误,则意味着 VStudio 无法找到该文件,这就是它显示“找不到标识符”的原因。

    在错误消息中,VStudio 会显示它在其中查找头文件的文件夹的路径。检查列表是否包含类似于“C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\ce\atlmfc\include”的路径,其中存在 ATL 头文件。如果缺少,请包括路径(使用适合您的操作系统和您正在使用的 VStudio 版本的路径),如下所示:Visual Studio:工具->选项->项目和解决方案->VC++ 目录->“显示目录用于包含文件”。

    【讨论】:

      【解决方案4】:

      【讨论】:

      • 我这样做了,但没有用
      • @Ramiz Toma:愿意告诉我们它是如何不起作用的吗?你得到编译器错误了吗?有什么错误(如果有的话)?
      • 错误 5 错误 C3861: 'CA2W': 找不到标识符 c:\users\owner\documents\visual studio 2010\projects\monopoly\monopoly\monopoly.cpp 170
      【解决方案5】:

      向我们展示您的代码,否则我们无能为力。

      您得到的错误是指:“CA2W 到底是什么?”

      这意味着你正在使用标识符 CA2W,但它没有被声明为任何东西。

      【讨论】:

      • 好的,我告诉你错误发生在哪里
      • @Ramiz:上面的代码不会改变答案。编译器根本不知道 CA2W 是什么。
      • @Ramiz Toma:如果你不知道CA2W 是什么,你为什么在代码中使用它?这与您在代码中输入一些乱码(例如jcgdhfgdh)然后开始询问为什么编译器不知道它是什么的情况没有什么不同。
      • @Ramiz Toma:所以你基本上是复制粘贴代码而不费心去理解它的作用?
      • @Ramiz Toma:它实际上不是一个函数。它是 CA2WEX 类的 typedef。基本上,您正在构建一个临时的CA2WEX 来执行转换。包括atlconv.h 应该足以解决问题,因为它是在那里定义的。它仍然不起作用的事实(正如您在另一个答案中提到的那样)意味着我们需要更多信息(比如编译器错误)。
      猜你喜欢
      • 2010-11-08
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多