C语言: 从 CodeBlocks 到 Microsoft Visual Studio 2017

  开学到现在寒假,学习了一个学期的C语言,同时也已然用了大半年的 CodeBlocks 来写 C/C++ 程序。CodeBlocks 是写 C/C++ 语言的程序最轻量的IDE(集成开发环境),在 C 语言IDE中名声也是不小的,整个体积包括编译器 GNU 才70-80MB。笔者软件专业教学所用的就是这个 CodeBlocks IDE,与之同样有着轻量能级、名气的 C/C++ 的IDE是 Dev C++ ,它为 CCF (China Computer Federation)中国计算机学会考试等级比赛指定IDE。我也是用过一下的,主要鉴于平时学习一直使用 CodeBlocks ,还有 Dev C++ 的交互界面不是很棒,有点掉档次。

  用习惯了 CodeBlocks, 就开始尝尝鲜,玩起了 Microsoft Visual Studio 2017,本文就以个人体验从 CodeBlocks 到 Microsoft Visual Studio 2017的小经历来讲述。Microsoft Visual Studio 微软出品,听说在自家的桌面级系统 Windows 下算是精品之作。

  且不评价,来看看 Microsoft Visual Studio吧。上 Visual Studio IDE 官网通过链接下载好 Microsoft Visual Stdio ,看到简介 “丰富的IDE 高级调试” 很牛逼嘛。下载打开发现正如网上所说用它来写 C 实在是小儿科了,这么多东西对于新手来说真的有点无从下手呀,所以C语言新手还是推荐 CodeBlocks 、Dev C++等这些轻量级的IDE,还有 VC 6.0 就不要用这个东西了,用来过过二级就好。

  在 Microsoft Visual Studio 安装的工作负载列表中看到


    Windows 栏下:通用Windows平台开发、使用C++的桌面开发、.net桌面开发

    Web 和 云 栏下:ASP.NET和Web开发、Python开发、Azure开发、Node.js开发、Office/SharePoint开发、数据存储和处理、数据科学和分析应用程序

    移动与游戏 栏下:使用.NET的移动开发、使用 Unity 的游戏开发、使用JavaScript的移动开发、使用C++的移动开发

    其他工具集 栏下:Visual Stdio 扩展开发、使用C++的Linux开发、.NET Core跨平台开发


  同时在单个组件的列表中,可以看到许多的组件可自选。语言列表中可以看到支持 波兰语、朝鲜语、德语、俄语、法语、捷克语、葡萄牙语、日语、土耳其语、西班牙语、意大利语、英语、中文(简体)、中文(繁体) 这14种语言

  功能众多的,用来写C真的是大材小用了。不过既然可以用来写C妨来试试,在工作负载列表中选择Windows栏下的通用Windows 平台开发安装就算是可能写C项目了(不然一个都选择,安装好了就像是个框框没有什么内容),勾选此项之后可以看到右下角的总安装大小达到了14G 左右!这安装盘的剩余空间没个20G怕是没法安装咯,而且目前才勾选了这一项,要全部勾选那可得准备50G的磁盘空间哟~这里笔者只是写写C就勾选安装这个14G左右的通用Windows平台开发就好了,接下来就是慢慢等咯,大概也就不到一个小时吧。

  安装好了,开始运行就要求登录微软账户,没有可以去注册。还有此软件可不是免费产品,需要密钥激活许可证。在菜单 帮助 > 注册产品,输入对应版本的密钥进行注册,以下仅给出了 Visual Studio 2017 企业版和专业版的密钥,其它版本请自行百度啦。

Visual Studio 2017(VS2017) 企业版 Enterprise 注册码 key:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

Visual Studio 2017(VS2017) 专业版 Professional 激活码 key:KBJFW-NXHK6-W4WJM-CRMQB-G3CDH

  好,完成以上步骤后。看到起始页,有点慌。CodeBlocks 下可以直接打开源文件对其进行编译,或者是新建.c源文件,其实可以用新建 Console Application 在 Sources 下的 main.c 来写C代码。而 Microsoft Visual Studio 2017也就是这样来玩的,文件>新建项目 在左侧已安装列表中可能看到之前安装的 Winodws 通用平台下的 Visual C++ > Windows 桌面 对应右侧选择 Windows 控制台应用程序(ConsoleApplication 也就是命令提示符窗口 图标也是一个命令提示符窗口的样式 C:\ ) 选择后在下方设置好名称、位置、解决方案名称等就可能确定新建了。

  新建后的的.cpp文件中默认内容为(虽说.cpp是C++源文件的后缀,不过可以用来写C的,当然可以在后续建立好项目的右侧中的 解决方案资源管理器 的方案中源文件的修改和方案名相同的.cpp文件后缀名为 .c )

// C Test.cpp: 定义控制台应用程序的入口点。
// #include "stdafx.h" int main()
{
  return ;
}

   这个头文件 stdafx.h 是啥? 它被称之为 预编译头 ,如果不写入此头文件会出现 C1010 错误,在点击带有下划线链接的错误代码可以转到网页的详情页,此页面描述了错误原因及如何关闭该错误。


查找预编译头时意外的文件尾。 是否忘记添加 #include 名称对源?

使用指定的包含文件/Yu源文件中未列出。 默认情况下,在大多数 Visual c + + 项目类型中启用了此选项,并且"stdafx.h"默认值包括此选项指定的文件。

在 Visual Studio 环境中,使用以下方法之一来解决此错误:

  • 如果你的项目中不使用预编译标头,设置创建/使用预编译标头属性源文件复制到不使用预编译头。 若要设置此编译器选项,请按照下列步骤:

    1. 在项目的解决方案资源管理器窗格中,右键单击项目名称,然后单击属性

    2. 在左窗格中,单击C/c + +文件夹。

    3. 单击预编译标头节点。

    4. 在右窗格中,单击创建/使用预编译标头,然后单击不使用预编译头

  • 请确保不要意外删除、 重命名或删除了标头文件 (默认情况下,stdafx.h) 从当前项目。 此文件还需要在你使用的源文件中的任何其他代码之前包含#include"stdafx.h"。 (此标头文件指定为通过文件创建/使用 PCH项目属


  这样设置后,就可以不用再添加头文件 stdafx.h 了。来写个 Hello World 吧!

#include<stdio.h>
int main(void)
{
printf("Hello World.\n");
}

  选择好菜单栏下方 解决方案配置 Debug/Release (关于两者区别) 解决方案平台 x86/x64 (两者区别) 然后点击 本地Windows调试器,就运行了。

  一闪而过,对此也很正常,程序执行完成就退出啦。这就和 CodeBlocks 就不同了,CodeBlocks 通过处理程序运行完成后会暂停。而 Microsoft Visual Studio 2017 则不同执行完成直接退出了,这就是为啥一闪而过。对此,


   可以在printf();语句后加上 system("pause"); 当然要记得加上头文件 stdlib.h

  也可以在printf();语句后加上 getchar();

  还可以在 调试 菜单中选择 开始执行(不调试),也可以按 Ctrl + F5

  或者我们可以在printf();下一行添加断点,将光标移动到printf();的下一行右键 断点>插入断点,当然可以在行号之前的竖栏中点击这样就可以快速在当前行添加断点


  以上方法根据自身情况去使用。

  还没完呢,当你使用 scanf 这个标准输入函数时会报错 C4996

  scanf() 错误    C4996    'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 
  关于此错误点击错误代码可以打开网页查看详情及解决方案:


编译器遇到弃用声明。The compiler encountered a deprecated declaration. 此警告始终是故意消息从库或附带的头文件,不应在不了解后果的情况下使用不推荐使用的符号的作者。This warning is always a deliberate message from the author of the library or included header file that you should not use the deprecated symbol without understanding the consequences. 由弃用修饰符或在声明的站点的属性指定实际的警告消息。The actual warning message is specified by the deprecation modifier or attribute at the site of the declaration.

这些是生成的 C 运行库和标准库,但不是一个详尽的列表的一些常见 C4996 消息。These are some common C4996 messages generated by the C Runtime Library and the Standard Library, but not an exhaustive list. 访问下列链接或阅读以获取的方法可以解决此问题,或者若要关闭该警告。Follow the links or read on for ways to fix the issue or to turn the warning off.

原因Cause

当编译器遇到函数或被标记为的变量,则会发生 C4996弃用使用__declspec(deprecated)修饰符,或当你尝试访问函数、 类成员或具有 C + + 14 的 typedef [[弃用]]属性。C4996 occurs when the compiler encounters a function or variable that is marked as deprecated by using a __declspec(deprecated) modifier, or when you attempt to access a function, class member or typedef that has the C++14 [[deprecated]] attribute. 你可以使用__declspec(deprecated)修饰符或[[deprecated]]属性自己库或标头文件来警告你有关已弃用的函数、 变量、 成员或 typedef 的客户端中。You can use the __declspec(deprecated) modifier or [[deprecated]] attribute yourself in your libraries or header files to warn your clients about deprecated functions, variables, members, or typedefs.

备注Remarks

许多函数、 成员函数,模板函数和 Visual Studio 中的库中的全局变量标记为弃用。Many functions, member functions, template functions, and global variables in the libraries in Visual Studio are marked as deprecated. 这些函数被弃用,因为它们可能具有不同的首选的名称,可能不安全或具有更加安全的变体,或可能已过时。These functions are deprecated because they may have a different preferred name, may be insecure or have a more secure variant, or may be obsolete. 许多弃用消息包括不推荐使用的函数或全局变量的建议的替换。Many deprecation messages include a suggested replacement for the deprecated function or global variable.

若要解决此问题,我们通常建议你更改代码以改为使用建议的更安全的或更新函数和全局变量。To fix this issue, we usually recommend you change your code to use the suggested safer or updated functions and global variables instead. 如果你需要使用现有的函数或变量,可移植性原因,可以关闭该警告。If you need to use the existing functions or variables for portability reasons, the warning can be turned off.

若要将关闭的警告,而无需解决的问题To turn the warning off without fixing the issue

你可以通过将关闭的警告的代码的特定行警告杂注, #pragma warning(suppress : 4996)。You can turn off the warning for a specific line of code by using the warning pragma, #pragma warning(suppress : 4996). 你还可以启用警告文件中使用警告杂注, #pragma warning(disable : 4996)。You can also turn the warning off within a file by using the warning pragma, #pragma warning(disable : 4996).

你可以关闭该警告全局在命令行版本中使用/wd4996命令行选项。You can turn the warning off globally in command line builds by using the /wd4996 command line option.

若要关闭的警告的 Visual Studio IDE 中的整个项目:To turn off the warning for an entire project in the Visual Studio IDE:

  • 打开属性页对话框为你的项目。Open the Property Pages dialog for your project. 有关如何使用属性页对话框的信息,请参阅属性页。For information on how to use the Property Pages dialog, see Property Pages.
  • 选择配置属性C/c + +高级页。Select the Configuration Properties, C/C++, Advanced page.
  • 编辑禁用特定警告属性来添加4996。Edit the Disable Specific Warnings property to add 4996. 选择确定要应用所做的更改。Choose OK to apply your changes.

你可以使用预处理器宏关闭弃用警告在库中使用的某些特定的类。You can also use preprocessor macros to turn off certain specific classes of deprecation warnings used in the libraries. 下面介绍了这些宏。These macros are described below.

若要在 Visual Studio 中定义预处理器宏:To define a preprocessor macro in Visual Studio:

  • 打开属性页对话框为你的项目。Open the Property Pages dialog for your project. 有关如何使用属性页对话框的信息,请参阅属性页。For information on how to use the Property Pages dialog, see Property Pages.
  • 展开配置属性 > C/c + + > 预处理器。Expand Configuration Properties > C/C++ > Preprocessor.
  • 预处理器定义属性,添加宏名称。In the Preprocessor Definitions property, add the macro name. 选择“确定” 进行保存,然后重新生成项目。Choose OK to save, and then rebuild your project.

若要仅在特定源文件中定义的宏,请添加行如#define EXAMPLE_MACRO_NAME包含的头文件的任意行之前。To define a macro only in specific source files, add a line such as #define EXAMPLE_MACRO_NAME before any line that includes a header file.


  在 项目>属性>配置属性>C/C++>高级 选项右侧中的 禁用特定警告 后方的文本框中添加 4996,再次F5就可以运行啦。

 还有,笔者在使用 gets 此函数时报错,这是因为 Microsoft Visual Studio 中 gets 被更安全的 gets_s 或 fgets 函数代替了,那根据实际选用 gets_s 和 fgets 函数啦。

  gets_s()出现开始于C语言的C11标准,是原gets()的安全版本。gets()不进行数组范围检查,也就是说,你定义一个长度为n的数组,你可以使用gets()读入长度大于n的字符串,编译可能不会出错,但运行时就会出现数组越界或内存泄露的错误。而gets_s()需指明待读字符串的长度参数,防止数组越界。

  最后一个笔者遇到的一个小问题,就是当执行无限循环的语句时,CodeBlocks 直接关闭窗口或按 Ctrl + C 终止,在 Microsfot Visual Studio 2017 中也可以通过关闭命令提示符窗口直接终止运行,也可通过 Ctrl + C 终止,不过呢,这样会报错:

   0x74C312B5 (KernelBase.dll)处(位于 ConsoleApplication1.exe 中)引发的异常: 0x40010005: Control-C

  在弹出的 已引发异常窗口 的异常设置下 引发此异常类型时中断 下 从以下位置引发时除外 下 KernelBase.dll 选上勾就行了,或者在 调试>窗口>异常设置 (Ctrl + Alt + E) 下的 Win32 Exceptions 项下的 0x40010005 选定右键 编辑条件 模块名 不等于 KernelBase.dll 就 Ok 了

  现在大概是可以好好写 C 了吧,用之前可以在 CodeBlocks 上运行的 C 代码在此中运行没什么问题吧。当然笔者也不保证,毕竟可能有些情况没有遇到呀。用 Microsoft Visual Studio 2017来撸 C 代码,听起来很有意思。与 Dev C++ 、 CodeBlocks 比起来,交互界面还行,在 工具>选项>环境>常规>视觉体验中有 蓝色、浅色和深色三种主题供选择。字体笔者就喜欢 Mac OS 的字体 SF Mono 和 Ubuntu 系统字体 Ubuntu Mono,这字体配上主题感觉很舒服。

  笔者拿来撸了下C语言代码,对其感觉很好。

  比如在 CodeBlocks 中整形变量没有取地址符 & 编译时不会报错,然而在输入数值进行赋值时就出错停止。而在 Microsoft Visual Studio 2017 则在你运行检查出来然后就报错,这样就避免了在输入好了数值回车时突然出错停止的尴尬情况;

  当然像

  for(i = 0; i < 5; i++)

    scanf("%d", num[i]);

  这样数组前没有带取地址符却没有提示了。。

  同样的对一个字符类型变量如果没有指定其大小, Microsoft Visual Studio 2017 也会在运行前检查并报错,不像 CodeBlocks 当执行运用该变量时才出错停止。

  在 CodeBlocks 中默认不支持 C99 的语法标准,如 for(int i = 0; i < n ; i++) 编译时会提示错误,解决方法就是在 Settings > Compiler Settings > Global compiler settings > Compiler settings > Other compiler ooptions 下的文本框中写入 -std=c99 然后 OK 在弹出的窗口也点击 OK,这样后在 CodeBlocks 编译有 C99 标准的语句时就不会出错了,如 for(int i = 0; i < 3; i++)。当然使用 Microsoft Visual Studio 2017 编译就不用这样了,直接编译就可以了。

  对于未使用的定义变量,Microsoft Visual Studio 2017 也会提示。

  当然还有许多笔者没有发现的功能和未知的错误,如 Ctrl + K +D 格式化全部代码等等,不过经过以上设置后,想写个 C 代码是没有什么问题了,就笔者目前所能写的范围而言。

  本文文笔有点乱,如有错请指出,如有遗漏也请补充。

上一篇:Visual Studio 2017 Key 激活码


下一篇:Visual Studio 2017 Enterprise 发布 15.3.2 版,附离线安装包下载。