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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25427220/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 11:18:51  来源:igfitidea点击:

string is not declared in this scope C++

c++windowsstringstd

提问by CodeBlocks

I have been testing out some gdi functions, and wanted to test out something with strings. However for some reason when I run this program I get the following error: 'string' was not declared in this scope

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

I even tried to include the "using namespace std" in the beginning (which usually I don't have to do in order to create strings) but in that case, after declaring std::string myString; I get another error saying: error: 'string' is not a member of 'std'

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

what could I be doing wrong? The complete code is here:

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

#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);

//++++++++++++++++++++HERE IS WHERE MY ERROR IS HAPPENING:

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

                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;
}

回答by Xarn

std::stringlives in stringheader. You might want to actually #include <string>before trying to use it.

std::string住在string标题中。#include <string>在尝试使用它之前,您可能想要实际使用它。

回答by Christophe

For your declaration to be recognized, you must

为了让您的声明得到认可,您必须

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

If you want to use this string in relation with windows api, you have to pass argument mystring.c_str() to get a pointer to a null terminated c-string:

如果要将此字符串与 windows api 相关联,则必须传递参数 mystring.c_str() 以获取指向空终止 c 字符串的指针:

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

Also, be carefull: depending on your compiling options (see here), you may have to use either std::string or std::wstring.

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

If you want to use heavily strings in windows programmes but you want your code to compile independently of unicode setting, like with TCHAR and TEXT(), you could opt for the following type definition:

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

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

which you can then use as a normal string/wstring depending on the compiling options:

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

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