You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C代码编译报错求助:字符串常量转char*及Windows兼容性问题

解决Windows 10下VS Code+MSYS2 Mingw64编译C代码的两个错误

错误1:ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

原因

代码中直接将字符串常量(如"="、"--"、"n")传递给参数类型为char*的函数。字符串常量属于只读内存,C标准要求用const char*声明这类不会被修改的字符串参数,避免意外写入引发未定义行为。MSYS2的GCC默认开启-Wwrite-strings警告,当检测到字符串常量转char*时会触发该错误。

修复方法

修改头文件和函数定义中接收字符串的参数为const char*,同时修正str_copy的参数顺序(原头文件中src和dest顺序写反,与函数实现不匹配):

修改后的my_functions.h

#ifndef HW1
#define HW1
#include <stdio.h>
int str_length(const char*);
void str_copy(char* dest, const char* src);
int str_find(const char* needle, const char* haystack);
int get_unnamed_argument(int index, int argc, char **argv, char *result);
int get_named_argument(int index, int argc, char **argv, char *result);
#endif

修改后的my_functions.c对应函数

int str_length(const char* string) {
    int c = 0;
    for (c = 0; string[c] != '\0'; c++);
    return c;
}

void str_copy(char* dest, const char* src) 
{
    int i;
    for (i = 0; src[i] != '\0'; i++) 
    {
        dest[i] = src[i];
    }
    dest[i] = '\0';
}

int str_find(const char* needle, const char* haystack)
{
    int c,x;
    for(c = 0; c < str_length(haystack); c++){
        if (needle[0] == haystack[c]){
            int count = 0;
            for(x = 0; x < str_length(needle); x++){
                if(needle[x] == haystack[c+x]){
                    count++;
                }
            }
            if (count == str_length(needle)){
                return c;
            }
        }
    }
    return -1;
}

错误2:File is not compatible with the version of Windows you're running

原因

编译生成的程序架构与Windows 10系统不匹配,大概率是误编译了32位程序,或者MSYS2环境配置错误导致生成了不兼容的二进制文件。

修复方法

  • 打开正确的终端:使用开始菜单中的MSYS2 MinGW 64-bit终端进行编译,不要使用Mingw32或纯MSYS2终端
  • 指定64位编译:编译时添加-m64选项,命令示例:
    gcc -m64 main.c my_functions.c -o program.exe
    
  • 更新MSYS2包:运行pacman -Syu更新所有工具包,确保GCC及依赖为最新64位版本
  • 清理旧文件:删除之前错误编译生成的.exe文件,重新编译

额外代码问题修复(避免运行错误)

  • main.c中char t[1];会导致缓冲区溢出,改为char t[2];(至少能容纳单个字符加结束符)
  • main.c同时包含#include "my_functions.c"和#include "my_functions.h"会引发函数重复定义,删除#include "my_functions.c",编译时将my_functions.c作为源文件一起编译(如上述gcc命令)

内容的提问来源于stack exchange,提问作者alpha01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:50:32