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
相关产品推荐
相关产品推荐

