字符串未在此范围内声明 C++

Posted

技术标签:

【中文标题】字符串未在此范围内声明 C++【英文标题】:string is not declared in this scope C++ 【发布时间】:2014-08-21 13:11:09 【问题描述】:

我一直在测试一些 gdi 函数,并想用字符串测试一些东西。但是由于某种原因,当我运行这个程序时,我得到以下 错误:“字符串”未在此范围内声明

我什至尝试在开头包含“使用命名空间 std”(通常我不必为了创建字符串而这样做),但在这种情况下,在声明 std::string myString; 之后我收到另一个错误说: 错误:“字符串”不是“标准”的成员

我做错了什么?完整代码在这里:

#define _WIN32_WINNT    0x0500  

#include <tchar.h>
#include <windows.h>


LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");

int WINAPI WinMain (HINSTANCE hThisInstance,
                 HINSTANCE hPrevInstance,
                 LPSTR lpszArgument,
                 int nCmdShow)

HWND hwnd;               /* This is the handle for our window */
MSG messages;            /* Here messages to the application are saved */
WNDCLASSEX wincl;        /* Data structure for the windowclass */

/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;                 /* No menu */
wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
wincl.cbWndExtra = 0;                      /* structure or the window instance */
/* Use Windows's default colour as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
    return 0;

/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
       WS_EX_LAYERED,// | WS_EX_TRANSPARENT,                   /* Extended possibilites      for variation */
       szClassName,         /* Classname */
       _T("Code::Blocks Template Windows App"),       /* Title Text */
       WS_OVERLAPPEDWINDOW, /* default window */
       CW_USEDEFAULT,       /* Windows decides the position */
       CW_USEDEFAULT,       /* where the window ends up on the screen */
       544,                 /* The programs width */
       375,                 /* and height in pixels */
       HWND_DESKTOP,        /* The window is a child-window to desktop */
       NULL,                /* No menu */
       hThisInstance,       /* Program Instance handler */
       NULL                 /* No Window Creation data */
       );


COLORREF greyishColor = RGB(212, 208, 200);
SetLayeredWindowAttributes(hwnd, greyishColor, 0, LWA_COLORKEY);

/* Make the window visible on the screen */
ShowWindow (hwnd, 3);//nCmdShow);



                HDC hdc;
                hdc = GetDC(hwnd);
                //drawing a rectangle
                    Rectangle(hdc, 100, 100, 200, 300);


                ReleaseDC(hwnd, hdc);


                ///again doing the hdc bit
                hdc = GetDC(hwnd);
                HPEN hPenOld;


                HPEN hLinePen;
                COLORREF qLineColor = RGB(255, 0 , 0);
                hLinePen = CreatePen(PS_SOLID, 7, qLineColor);
                hPenOld = (HPEN)SelectObject(hdc, hLinePen);

                MoveToEx(hdc, 100, 100, NULL);
                LineTo(hdc, 500, 250);

                SelectObject(hdc, hPenOld);
                DeleteObject(hLinePen);

                ///again releasing
                ReleaseDC(hwnd, hdc);

//++++++++++++++++++++++这里是我的错误发生的地方:

                string myString;


/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))

    /* Translate virtual-key messages into character messages */
    TranslateMessage(&messages);
    /* Send message to WindowProcedure */
    DispatchMessage(&messages);


/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;



/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

    switch (message)                  /* handle the messages */
    
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    

    return 0;

【问题讨论】:

你可能想#include &lt;string&gt; 可能吗? 那么,您希望string 是什么? 【参考方案1】:

std::string 位于 string 标头中。在尝试使用它之前,您可能需要实际 #include &lt;string&gt;

【讨论】:

太棒了,解决了它。顺便说一句,由于某种原因,在我创建的这个新项目中,其他函数(如 cout...string...)也发生了同样的情况,在我的其他项目中,我通常不需要 #include 或其他标题,只需 #include ...知道是什么原因造成的吗? @CodeBlocks 标头包含是可传递的(因为它们只是一种无需手动操作即可将粘贴的代码片段复制到当前文件的方法),因此您可能包含了包含它们的标头。转到cppreference 并检查您需要为给定的标准库包含哪些标头。 (您应该从不依赖标准库中的传递包含)【参考方案2】:

要使您的声明得到认可,您必须

#include <string>
using std::string;     // (or using namespace std if you want to use more of std.)  

如果你想在 windows api 中使用这个字符串,你必须传递参数 mystring.c_str() 来获得一个指向空终止 c 字符串的指针:

MessageBox(NULL, mystring.c_str(), TEXT("Attention !"), MB_OK); 

另外,请注意:根据您的编译选项(请参阅here),您可能必须使用 std::string 或 std::wstring。

如果您想在 Windows 程序中大量使用字符串,但又希望代码独立于 unicode 设置进行编译,例如 TCHAR 和 TEXT(),您可以选择以下类型定义:

typedef std::basic_string<TCHAR> tstring;  // based on microsoft's TCHAR 

然后您可以根据编译选项将其用作普通字符串/wstring:

tstring s, t( TEXT("Hello"));
s = t + TEXT(" world !"); 

【讨论】:

using std::string; 的破坏性会更小。 这是一个品味问题。查看操作的代码,他使用字符串而不是他在文本中声称的 std::string。 是的,这就是问题所在。现在困扰我的是......为什么我之前在其他项目上没有收到这个错误?在我从来没有做过 #include 并且一直使用字符串之前。另外,当我使用“cout”时,我在这个项目中遇到了同样的错误......有什么想法吗? 我确实尝试使用std::string(只是没有#include ),我只是展示了没有使用命名空间std的代码;因为那是我的第一次尝试和错误,而且因为通常这会在我的其他项目中起作用,所以我不知道它为什么会起作用,现在它需要 #include 和 using namespace std; 也许在你的其他项目中你把它放在了一个 include 中?例如在“stdafx.h”中?

以上是关于字符串未在此范围内声明 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++ Win API 函数'未在此范围内声明'

C++ 错误:“QueryFullProcessImageNameA”未在此范围内声明

我正在更换未在此范围内声明

未在此范围内声明(C++ 中的数组)[关闭]

C++“未在此范围内声明”编译错误及修改提示

错误:未在此范围内声明“对象”