语出《论语·卫灵公》:子贡问为仁。子曰:“工欲善其事,必先利其器。居是邦也,事其大夫之贤者,友其士之仁者。”

2020年11月终于下定决心开始 Visual C++ 的学习了,首先要学习 C++,但不考虑任何 Windows 编程事项。在熟悉了 C++ 之后,再进行学习如何开发 Windows 应用程序。

但在学习 C++ 的时候,将使用仅仅涉及命令行输入和输出的程序,我们能够集中于 C++ 语言工作过程的细节,不被 Windows 的复杂性分散注意力。

在熟悉 C++ 之后,在 Windows 应用改程序的开发中应用 C++是一件容易、自然的事情。

Visual C++控制台应用程序允许编写、编译并测试没有任何 Windows 程序所需元素的 C++ 程序,实际就是基于字符的命令行程序。

Visual C++ 一起提供的 IDE 是一个很好的学习 C++ 的环境,包括了编辑器、编译器、链接器和库等部件,这些部件都是编写和执行 C++ 程序必须的基本工具。

认识 Visual Studio 2012

所有示例均在 Visual Studio 2012 下进行,安装好后,IDE 界面如下图,包括有 菜单栏、工具栏、Solution Explorer、Editor 和 Output 等内容。

理解什么是项目和解决方案

解决方案就是存储一个或多个项目有关的所有信息的文件夹,解决方案有关信息存储在扩展名为 .sln 和 .suo 两个文件中。

项目是否成某个程序的全部组件的容器,有关项目的信息存储在扩展名为 .vcxproj 文件中。

当创建项目时,没有选择在现有的解决方案中添加该项目,那么系统将会自动创建一个新的解决方案。

开始创建第一个 Win32 控制台应用程序

第一步

使用主菜单 File | New | Project 菜单项

第二步

New Project 窗口中选择 Win32 Console Appliaction,在 Name 文本框中输入项目名称,Location 文本框中选择存储路径,Solution name 文本框中输入解决方案名称,点击 OK 按钮下一步。

第三步

Win32 Application Wizard 界面中,保持默认选项,点击 Finish 按钮,项目创建完成。

第四步

创建的项目将自动显示在 Visual C++ 的 Solution Explorer 窗口中,如下图。

第五步

在 Windows 资源管理中 查看该项目,如下图

第六步

双击 Solution Explorer 窗格中的 ConsoleApplication2.cpp 文件进行源代码修改,第 5 行和第 10 行是新增的行。

  1 // ConsoleApplication2.cpp : Defines the entry point for the console application.
2 //
3
4 #include "stdafx.h"
5 #include <iostream> //添加一个C++标准库,该库定义了基本 I/O 操作功能
6
7 int _tmain(int argc, _TCHAR* argv[])
8 {
9 // std::cout 标准输出流名称,将字符串 Hello world!\n 输出
10 std::cout << "Hello world!\n";
11 return 0;
12 }

第七步

F7 或者 菜单项 Build | Build Solution,开始构建解决方案,构建成功后在 Windows 资源管理器 中看到新增了一个子文件夹 Debug,包含 3 个文件。

.ilk 文件使链接器能够根据修改的源代码生成目标文件增量地链接到现有的 .exe 文件,避免每次修改程序都重新链接所有文件。

.pdb 文件包含调试信息,在调试模式中执行程序时要使用该调试信息。在调试模式中,可动态检查程序执行过程中所生成的信息。

第八步

ConsoleApplication2 项目文件夹 中也有一个 Debug 子目录,其中包含构建过程中生成的很多文件。

第九步

Debug 版本Release 版本

通过菜单项 Project | Properties 项,可以设定许多项目选项,决定了在编译和链接阶段处理源代码的方式,产生具体的可执行程序版本所对应的选项集合成为配置。

Visual C++ 自动创建可产生两种应用程序的配置:Debug 版本Release 版本,也可以从菜单项 Build | Configuration Manager 添加其他配置。

在使用 Debug 配置调试过的应用程序,在看起来可以正常工作之后,通常构建为 Release 版本,这样将产生没有调试和跟踪能力的优化代码,程序运行更快,占用更少内存。

第十步

执行程序,按下 Ctrl + F5 组合键来执行,如下所示

尝试创建空控制台项目

Step 1

重复前面步骤,在第三步中 Application Settings 选项卡中选中 Empty Project 复选框,点击 Finish 按钮创建项目。

Step2

Solution Explorer 中看不到任何源文件,如下图。

Step 3

默认情况下,项目选项设置为使用 Unicode 库,这将使得程序主函数使用非标准名,如上面创建的第一个控制台程序中主函数名为 _tmain(),并非我们标准的 main()。

为了在控制台程序中使用标准的本地 C++,需要关闭使用 Unicode 库,Alt + F7 打开 Property Pages 对话框,在顶部 Configuration 下拉列表中选中 All Configurations 选项,在左边窗口中选中 General 分类,在右边选中 Character Set 属性,设置为 Not Set 。

在之后讲解的所有 C++控制台程序的所有示例都将这么设置下,否则不能通过构建。

Step 4

添加新的源文件,在 Solution Explorer 窗格 中,右键菜单 Add | New Item 打开 Add New Item 对话框,选择 Code 分类 中的 C++ File (.cpp) 选项,然后输入文件名,点击 Add 按钮 就添加了这个新文件。

Step 5

Editor 中编辑 Main.cpp 源文件,输入下面的代码:

  1 #include <iostream>
2
3 int main()
4 {
5 std::cout << "这是一个简单输出文本程序" << std::endl;
6 std::cout << "可以输出多行文本" << std::endl;
7 std::cout << "只需要在结尾输入 std::endl 语句即可" << std::endl;
8 return 0;
9 }

Step 6

成功编译该程序,并 Ctrl + F5 执行它,输出结果如下图。

(1)Hello World的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. ASP.NET Core 之 Identity 入门(一)

    前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...

  4. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  5. Online Judge(OJ)搭建(第一版)

    搭建 OJ 需要的知识(重要性排序): Java SE(Basic Knowledge, String, FileWriter, JavaCompiler, URLClassLoader, Secur ...

  6. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  7. 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成

    阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...

  8. 【.net 深呼吸】细说CodeDom(5):类型成员

    前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...

  9. 【.net 深呼吸】细说CodeDom(4):类型定义

    上一篇文章中说了命名空间,你猜猜接下来该说啥.是了,命名空间下面就是类型,知道了如何生成命名空间的定义代码,之后就该学会如何声明类型了. CLR的类型通常有这么几种:类.接口.结构.枚举.委托.是这么 ...

  10. 【.net 深呼吸】细说CodeDom(2):表达式、语句

    在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...

随机推荐

  1. AtCoder 1807 食塩水

    题意 有 \(n\) 瓶食盐水,第 \(i\) 瓶为质量 \(w_i\),浓度 \(p_i\%\) 的食盐水,需要选出 \(k\) 瓶食盐水混合在一起,问最大浓度. \(\texttt{Data Ra ...

  2. 敲黑板:InnoDB的Double Write,你必须知道

    世界上最快的捷径,就是脚踏实地,本文已收录[架构技术专栏]关注这个喜欢分享的地方. 前序 InnoDB引擎有几个重点特性,为其带来了更好的性能和可靠性: 插入缓冲(Insert Buffer) 两次写 ...

  3. .netcore跨域设置

    跨域 广义上讲,跨域是指一个域下的文档或者脚本试图去请求访问另一个域下的资源(像我们直接通过代码使用http请求资源,或者是使用辅助工具(例如postman)是可以直接访问的,没有跨域的概念):而我们 ...

  4. ajax传值出现乱码问题

    第一种:前台传值到后台,浏览器控制台打印正常,controller接收后成了乱码. 后台controller层加上两行转换代码 name=URLDecoder.decode(name,"ut ...

  5. 分布式文档存储数据库之MongoDB索引管理

    前文我们聊到了MongoDB的简介.安装和对collection的CRUD操作,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13941797.html:今天我 ...

  6. 1 Prism概述

    架构目标 以模块化方式开发应用,这些模块被独立团队用WPF技术开发,集成,部署,这是使用Prism的最大好处. 最小化交叉团队依赖.允许团队在不同领域专业化,比如UI设计,商业逻辑实现,基础代码开发 ...

  7. Git Push大文件报错后如何撤回

    昨晚在提交一个项目代码时,不小心把数据库备份文件也一起Commit了:到最后Push的时候报错了.最后弄了半天解决了,在此记录下. 如下图,文件有108M. 项目放在第三方托管平台上,根据提示查看了原 ...

  8. VMware 虚拟机下CentOS 7连接网络

    查看主机网络配置 ipconfig 1.在centos打开终端命令 2. 输入命令 cd /etc/sysconfig/network-scripts/  进入文件 输入 ls查看此文件夹下的文件 3 ...

  9. Skip Lists: A Probabilistic Alternative to Balanced Trees 阅读笔记

    论文地址:https://15721.courses.cs.cmu.edu/spring2018/papers/08-oltpindexes1/pugh-skiplists-cacm1990.pdf ...

  10. shell编程之算术扩展(引号、命令替换、算术扩展)

    1.单引号 .双引号.反引号的区别 单引号:忽略所有特殊字符 双引号:忽略大部分特殊字符($  `等字符除外) [root@tlinux shell]# echo '*' * [root@tlinux ...