C语言课堂–现代编译环境搭建[2020年7月]

看过了很多专家吐槽目前的大学c语言教学问题多多:

  • 教材难懂,消磨了学生的兴趣;
  • 环境老旧,都2020了还有在用VC6甚至TurboC 2.0,语法不规范。

轮到自己上课,心想可不能再继续这样的c语言课堂。

1. 教材选择

先从教材的选择开始, 网上大家评价较好的有两本:

第1本是日本的经典c语言教材,第二本据说是普林斯顿大学的c语言参考教材。
考虑到第2本618页的厚度,为了避免把同学们吓住,就选了第一本。
两本都比较贵,但是比起用完就扔的垃圾教材,毕业多年后再翻出来看的经典教材,绝对物有所值! 相信同学们会理解的。

2. 编程环境选择的原则

选定教材,编程环境是最重要的。选择原则:

  • 编译器不能太老旧,vc6和TC2就算了。至少c99标准完美支持吧。
  • 不能太傻瓜化,VS2015、VS2017/19啥的,轻松占几十G空间不说,学生还搞不懂编译的过程。
  • 最好是业界在用的,有一些教学环境也不错(比如:DevCpp,codeblocks)但公司里哪见过有人用?

这么一筛选,也就只能从 VS201x,VSCode,Clion 这几个中选了,那就用最轻量的 VSCode吧!
编译器也只有这三个: cl,gcc,clang。 既然不装vs大块头,那windows下gcc最好用。

2.1 下载安装gcc编译器: Mingw-w64

MinGW 的全称是:Minimalist GNU on Windows 。
它实际上是将经典的开源 C语言 编译器 GCC 移植到了 Windows 平台下,并且包含了 Win32API。一句话来概括:MinGW 就是 GCC 的 Windows 版本 。
MinGW有两个发行版:MinGW-w64 与 MinGW 。区别在于 MinGW 只能编译生成32位可执行程序,而 MinGW-w64 则可以编译生成 64位 或 32位 可执行程序。
正因为如此,果断采用 MinGW-w64。

文件清单:

x86_64-posix-sjlj
x86_64-posix-seh
x86_64-win32-sjlj
x86_64-win32-seh
i686-posix-sjlj
i686-posix-dwarf
i686-win32-sjlj
i686-win32-dwarf

作为学生现在的电脑软硬件水平,推荐下载: x86_64-posix-seh

  • 释义1:

x86_64: 简称X64,64位操作系统。
i686: 32位操作系统 (i386的子集),差不多奔腾2(1997年5月)之后的CPU都是可以用的;

  • 释义2:

DWARF:一种带调试信息(DWARF- 2(DW2)EH)的包, 所以比一般的包尺寸大,仅支持32位系统
SJLJ:跨平台,支持32,64位系统,缺点是:运行速度稍慢,但是可以在没有使用GCC编译的代码或没有调用堆栈的代码上工作
SEH: 调用系统机制处理异常,支持32,64位系统。(Structured Exception Handling)Windows使用自己的异常处理机制。

  • 释义3:

posix: 启用了C++ 11 多线程特性
win32: 未启用 (从时间线上正在尝试也启用部分 Treading)

验证: 打开cmd黑窗口, 分别敲命令: gcc, g++, gdb, 分别看看这几个命令是否输出正确.

2.2 下载安装VSCode编辑器

注意选择好 x64 或者 x86,
有两个.exe的是安装包(需要系统权限,不需要系统权限安装),另外.zip那个是绿色解压就能用的.

安装插件: c/c++ tools, chinese简体中文语言包, code-runner
具体步骤省略, 若连不上微软marketplace,那就FQ下载visx包离线安装.

2.3 配置VSCode的c语言环境

总结一下:

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "C:/Lang/mingw64/include",
                "C:/Lang/mingw64/x86_64-w64-mingw32/include"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "8.1",
            "compilerPath": "C:/Lang/mingw64/bin/gcc.exe",
            "cStandard": "c99",
            "cppStandard": "c++11",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

3)第二个配置文件: tasks.json, 用于定义编译任务. 以下代码定义了两个编译任务:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "C: gcc.exe build active file",
            "command": "gcc.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "-std=c99"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "type": "shell",
            "label": "C: gcc.exe build ALL *.c files",
            "command": "gcc.exe",
            "args": [
                "-g",
                "${workspaceFolder}\\*.c",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "-std=c99"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build"
        }
    ]
}

4)第3个配置文件: launch.json ,用于配置调试相关任务. 代码如下:

{
    // 使用 IntelliSense 了解相关属性。
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "gcc.exe - 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:\\Lang\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C: gcc.exe build active file"
        }
    ]
}

5)第4个配置文件: settings.json , 是编辑器本身的一些配置. 这里我配置了: 启动cmd时直接chcp 65001切换到utf8环境,还有code-runner的c语言配置:

{
    "terminal.integrated.shell.windows": "C:\\Windows\\System32\\cmd.exe",  //默认的shell环境:cmd
    "terminal.integrated.automationShell.windows":  "C:\\Windows\\System32\\cmd.exe", //缺少此行, 在65001环境下编译可能会提示: 无效的参数 -/d.

    //"terminal.integrated.shellArgs.windows": ["/K", "chcp 65001>nul"],   //打开cmd时自动切换到utf-8环境, 避免中文乱码. 不输出chcp回显
    "terminal.integrated.shellArgs.windows": ["/K", "chcp 65001>nul"],   //打开cmd时自动切换到utf-8环境, 避免中文乱码. 有 65001 代码页回显

    "code-runner.executorMap": {
        "javascript": "node",
        "php": "C:\\php\\php.exe",
        "python": "python",
        "perl": "perl",
        "ruby": "C:\\Ruby23-x64\\bin\\ruby.exe",
        "go": "go run",
        "html": "\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\"",
        "java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
        "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
    },
    "code-runner.defaultLanguage": "c"
}

安装好 vscode 及插件, 然后拷贝文件到两种配置位置:

  • 拷贝4个json文件, 扔到工作目录(自己写代码的目录)的 .vscode 文件夹下[推荐!]
  • 或后3个json文件, 扔到用户的个人文件夹下: C:\Users\zhw\AppData\Roaming\Code\User\

搞定!

为了方便学生, 上课前将上述4个文件打个包,直接让学生下载即可:

Original: https://www.cnblogs.com/zhw618/p/13353903.html
Author: zhw618
Title: C语言课堂–现代编译环境搭建[2020年7月]

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581796/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Abp vNext中集成Redis

    在Abp vNext中默认集成了缓存,可以使用.net Core自带的缓存,也可以使用Redis,但官网的Redis集成中少掉了一个依赖项的介绍。 首先,正常使用Abp vNext…

    Linux 2023年5月28日
    089
  • Linux上安装并启动tomcat

    1、下载tomcat安装包 官网链接:https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.57/bin/ 2、将tomcat上…

    Linux 2023年6月6日
    0116
  • Jenkins初始化界面一直显示Please wait while Jenkins is getting ready to work …

    第一次访问 jenkins时,会提示如下界面: 注:如果这个界面初始化的时间过长,则需要修改相关配置文件。 原因:因为访问官网太慢。我们只需要换一个源,不使用官网的源即可。 1、找…

    Linux 2023年6月13日
    095
  • 实验2:Open vSwitch虚拟交换机实践

    实验2:Open vSwitch虚拟交换机实践 一、实验目的 能够对Open vSwitch进行基本操作; 能够通过命令行终端使用OVS命令操作Open vSwitch交换机,管理…

    Linux 2023年6月7日
    0117
  • MySQL 新增表分区很慢,转移大表数据

    问题: MySQL (version 5.7.26) 数据库有一批表 xxx_yyy,由于评估的数据量可能比较大,因此每张表都设置了表分区,把每个月的数据保存在单独的分区里。 那么…

    Linux 2023年6月14日
    099
  • MSSQL中Repalce函数处理长字符串时报异常的解决方案

    阅文时长 | 17.99分钟字数统计 | 28788.8字符主要内容 | 1、引言&背景 2、问题还原 3、解决方案 4、官方解释 5、声明与参考资料『MSSQL中Repa…

    Linux 2023年6月14日
    074
  • 用 shell 脚本制造连接频繁中断的场景

    问题的提出 最近在准备客户端的新版本,在内部灰度过程中,发现一类奇怪的 dump,通过查看日志和堆栈,可以确定是因为每次连上后台就被后台断开了、导致多次重连后随机发生的崩溃。dum…

    Linux 2023年6月6日
    092
  • 关于多个 Cookie 的分隔符这件事

    对于 Cookie 的处理上,我最近遇到一个问题,那就是如何分割 Cookie 的内容。有人说是使用逗号分割,有人说是使用分号分割,究竟用哪个才是对的?其实这个答案是需要分为两个过…

    Linux 2023年6月6日
    089
  • 2018部分

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    084
  • 通过示例学习PYTORCH

    核心是:PyTorch提供了两个主要的特性: 一个n维的Tensor,与Numpy相似但可以在GPU上运行 构建和训练神经网络的自动微分 我们将使用一个三阶多项式拟合 (y=sin…

    Linux 2023年6月14日
    0108
  • 网络扫描(二)

    免责声明:本文所述工具只用于网络安全的学习与研究。严禁任何阅读本文的读者利用本文所述工具进行违法犯罪活动。如有任何法律纠纷本文作者概不负责。 上一篇博文讲到了fping工具和nma…

    Linux 2023年6月14日
    092
  • Android安卓进阶技术分享之AGP工作原理

    1.基础准备 在分析源码之前,我想你应该对 Android 打包流程已经有基础的了解,至少了解了下图的打包过程: 否则你有可能不了解下文中的专业术语。 2.AGP源码的打开方式 看…

    Linux 2023年6月13日
    0113
  • 使用 sh -x 进行 shell 脚本调试

    转载请注明出处: sh -x 命令的执行,会将shell 命令的每一个执行步骤进行打印,可以查看到 整个命令或脚本的执行过程的 debug。 sh -n 只读取shell脚本,检测…

    Linux 2023年5月28日
    0114
  • springboot系列十一、redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较

    一、redisTemplate和stringRedisTemplate对比 RedisTemplate看这个类的名字后缀是Template,如果了解过Spring如何连接关系型数据…

    Linux 2023年5月28日
    0121
  • CSS中content属性的妙用

    前言 本文讲解CSS中使用频率并不高的content属性,通过多个实用的案例,带你由浅入深的掌握content的用法,让代码变得更加简洁、高效。 定义 W3school中这样定义:…

    Linux 2023年6月7日
    0132
  • 2.VMware三种网络模式

    本文参考《Vmware虚拟机三种网络模式详解》、《网络原理,以及对VMware Workstation虚拟网络VMnet0、VMnet1、VMnet8的图解》 一.VMware的网…

    Linux 2023年5月27日
    0123
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球