常见问题

小熊猫C++使用中的常见问题及其解答

编译器相关

小熊猫C++中每个编译器有Debug和Release两个配置集,有何区别?

配置类型 作用
Release 生成优化、静态链接的可执行文件。其执行速度最快,可以脱离gcc环境独立运行
Debug 生成调试用的可执行文件;其中包含了调试信息和符号,运行速度相对较慢;脱离gcc环境运行时会提示缺少dll文件

MinGW-w64官方的版本只有8.1,为什么小熊猫C++自带的MinGW-w64 GCC版本是11.2 / 13.1?

首先必须需要说明,MinGW-w64和GCC是两回事:GCC是一个C/C++编译器,而MinGW / MinGW-w64是windows系统下的C/C++基本运行函数库。

截止2022年5月,GCC的官方网站上发布的GCC最新版本已经是12.1; MinGW-w64官方日志中发布的MinGW-w64的最新版本是10.0.0。

小熊猫C++ 1.0.6带的gcc编译器版本是基于MinGW-w64库的GCC 11.2。

网上流传比较广的MinGW-w64 gcc 8.1实际的版本号是gcc 8.1和MinGW-w64 6.0,它来源于MingW-W64-builds网站,该网站提供了mingw-w64库的最新版本,但并未提供最新的基于MinGW-w64的GCC编译器。如果想在windows下使用最新的mingw-w64库和gcc编译器,可以考虑安装MSYS2

小熊猫C++自带的MinGW-w64 GCC是哪儿来的?为什么不使用MSYS2版本?

2.22版前小熊猫C++自带的MinGW-w64 GCC(包括32位和64位)均来自于Qt wiki

2.23版之后小熊猫C++自带的MinGW-w64 GCC 13.1来自于mingw builds,并做了如下改动:

之所以不使用MSYS2版本的MinGW-w64 GCC编译器,是因为它的gdb编译器存在bug,当所在文件夹的完整路径中包含非ascii字符时,会无法启动。这会导致小熊猫C++无法调试程序。而qt版本的gcc编译不存在这个问题。

小熊猫C++自带的Clang编译器是哪儿来的?

由于clang只支持gbk编码,在中文windows下处理中文输入非常麻烦,不利于初学者和教学使用,所以从小熊猫C++ 1.1.2版本开始不再自带clang编译器。有兴趣的用户可以自行从LLVM MinGW下载最新版的clang编译器。

小熊猫C++自带的Clang编译器来自于MSYS2。是的,这个版本的gdb同样存在当所在文件夹的完整路径中包含非ascii字符时,无法启动的bug。但这已经是目前为止作者在网上能找到的最好的可独立使用的Clang编译器发行版了。

Clang编译器和GCC编译器有啥区别?如何选择?

GCC是一个久经考验的开源C/C++编译器,大多数编程竞赛和OJ(网上判题)网站都在后台使用这个编译器。和Clang相比,它的优点是:

  • 支持文件的字符编码转码操作。在小熊猫C++中用它编译的程序里可以直接用printf或者cout输出中文字符串,而基本不用担心乱码问题。
  • 遇到问题时在网上比较容易找到相关的解答。

Clang是相对较新的开源C/C++编译器。它的优点是:

  • 提供比gcc更直观友好的错误提示信息
  • 支持-fsanitize=address参数,编译出的程序在检测到内存/数组访问越界行为时会自动提示并退出。

缺点是:

  • 不支持文件的字符编码转码操作。容易遇到中文乱码问题

所以,对于自学C/C++,或者不太容易获得教师答疑的用户来说,建议使用GCC编译器

项目相关

windows下,项目全部重新编译时显示“clean Error 127 (ignored)”

请检查系统环境变量PATH里的文件夹中是否存在sh.exe文件。将其改名或者移除即可。

错误原因: 小熊猫C++构建项目使用的mingw32-make会优先运行PATH中的sh.exe,然后再查找del程序。而del是windows系统控制台程序cmd.exe自带的命令,sh无法找到它,因此会出现Error 127找不到命令错误。

Clang相关

如何让用Clang编译的程序正确显示中文

使用wchar_t字符串代替char字符串。参考下面的c程序(在cpp程序中应使用wcout代替cout)

**注意:由于MinGW-w64中stdlib的bug,该程序使用gcc编译时运行结果乱码

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main() {
	wchar_t msg[200];
	wchar_t name[100];
    // 将程序的Locale设为简体中文,这一步很重要
	setlocale(LC_ALL,"zh_CN");

	wprintf(L"你叫什么?");
	wscanf(L"%ls",name);
	wcscpy(msg,L"你好,");
	wcscat(msg,name);
	wprintf(L"%ls\n",msg);
	return 0;
}

如何让用Clang编译的ege程序正确显示中文

使用wchar_t字符串代替char字符串。参考下面的c程序

#include <graphics.h>
#include <wtypes.h>
#include <locale.h>

#define BUF_SIZE 4096

int main() {
	wchar_t buf[BUF_SIZE+1];
	initgraph(640,480);	
	inputbox_getline(L"名字",L"名字",buf,BUF_SIZE);	
	xyprintf(200,200,L"你好!%ls",buf);
	getch();
	return 0;
}
最后修改 July 15, 2023: update (b0ddb0ce)