C ++:不推荐使用从字符串常量转换为' LPSTR {aka char *}' [-Wwrite-strings] - 警告。怎么避免?

时间:2014-03-22 20:23:56

标签: c++ string

编译C ++代码时,我收到此警告:

  

已弃用从字符串常量转换为'LPSTR {aka char *}'   [-Wwrite串]
  & pi))//指向PROCESS_INFORMATION结构的指针。   
^

代码是:

STARTUPINFO si;
memset(&si, 0, sizeof (STARTUPINFO));
si.cb = sizeof (STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = FALSE;

PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof (PROCESS_INFORMATION));

if (!CreateProcess("C:\\Program Files\\Java\\jre7\\bin\\javaw.exe",
        " -jar install.jar", // Command line.
        NULL, // Process handle not inheritable.
        NULL, // Thread handle not inheritable.
        0, // Set handle inheritance to FALSE.
        CREATE_NO_WINDOW, // ON VISTA/WIN7, THIS CREATES NO WINDOW
        NULL, // Use parent's environment block.
        NULL, // Use parent's starting directory.
        &si, // Pointer to STARTUPINFO structure.
        &pi)) // Pointer to PROCESS_INFORMATION structure. //Warning comes from this line - variable &pi
{
    printf("CreateProcess failed\n");
    return 0;
}

是否可以采取措施避免这种情况(我的意思是不使用 - 抑制警告)?

2 个答案:

答案 0 :(得分:5)

编译器告诉您,CreateProcess的第二个参数属于char*类型,但您传递的是const char*。换句话说,CreateProcess的第二个参数需要一个可修改的缓冲区,但是你传递的是一个不可修改的文字。

声明一个可修改的字符串,如下所示:

char cmdline[] = "-jar install.jar";

答案 1 :(得分:0)

CreateProcess()API的第二个参数应如下所示:

  

_Inout_opt_ LPTSTR lpCommandLine,

现在你在这里直接传递const char *值,因此你得到了警告。

  

char cmdline [] =“ - jar install.jar”;

应该避免这种警告。