C++入门(03)萌新问题多(一)

12 篇文章 0 订阅

1. 一闪而过

.exe 在用户计算机上运行后“一闪而过”,是因为控制台程序没有专门的用户图形界面,程序执行完所有代码后默认完成任务自动关闭

使用system(“pause”)

在程序的结尾处加入 system(“pause”),程序在执行完毕后等待用户按任意键继续。这是最简单的方法。
在这里插入图片描述

使用cin.get()

在这里插入图片描述

2. 关于ends

在 C++ 中,cout 是一个与标准输出(控制台)相关联的输出流对象,执行“cou<<”时,每一个输出项(跟在插入符<<后面的项),先被放到缓冲区,满足一定条件时,从缓冲区集中送到控制台。参考“C++入门(07)标准输入输出_cout、缓冲、\n endl”

控制符是一些特殊的符号或指令,用于调整送到屏幕上面的布局和格式。endl 和 ends 是常用的控制符。

ends 控制符,向输出流中插入一个空字符 ‘\0’,终止符,一般不用在普通的文本输出,更多地在特殊情况下,例如明确字符串的终止,手动终止字符串,或者在某些需要特定格式的数据传输情况。

这里,我们设计一个小栗子,手动在“Hello,World!”字符串后面插入一个 空字符 ‘\0’,终止符

例如

#include<iostream>
#include<sstream>
using namespace std;

int main() 
{
    cout << strlen("Hello,World!"); //字符串常量末尾有一个隐含的\0
                                    //隐含的终止符 \0 不计入字符串长度,12
    cout << endl;
    cout << string("Hello,World!").length() ; //隐含的终止符 \0,不计入字符串长度,12
    cout << endl;


    ostringstream oss;              //用于将数据写入内存中的字符串
    oss << "Hello,World!" << ends;  //字符串常量末尾有一个隐含的\0,显式地插入一个\0
                                    //输出流 oss 的内容变成了 "Hello,World!\0",其中 \0 是由 std::ends 插入的

    string str = oss.str();         //获取由流生成的字符串
                                    //oss.str() 被转换为 string 时,
                                    //保留显式插入的\0,忽略隐含的 \0
                                    //此时,str内容为 Hello,World!加一个显式插入的\0

    //输出字符串长度
    cout << "String length:" << str.length() << endl;//输出:String length: 13,计算了显式插入的\0
    cout << "String: " << str << endl;               //输出:Hello,World!

    //观察末尾的字符
    for (char c : str)
    {
        cout << (c == '\0' ? "\\0" : string(1, c)) << " ";
    }
    //输出 H e l l o , W o r l d ! \0

    return 0;   
}

3. VisualStudio方案、项目、源程序

与此相关的问题:

  • 一个方案里放置了多个CPP,每个CPP都有main()
  • 直接从文件资源管理中打开first.cpp,它显示的是杂项文件而且无法调试运行呢?

3.1 理解VisualStudio组织开发文件的方式

方案Solution
可以包含一个或多个项目。它是一个整体的开发环境,用于管理和组织相关的项目, 方案文件的扩展名通常是 .sln,它记录了整个开发环境的配置,包括项目的位置和构建的配置

项目Project
项目是方案中的一个具体组成部分,每个项目对应一个独立的可执行程序、库或者其他目标。对于 C++ 项目项目文件的扩展名通常是 .vcxproj。每个项目有自己的源代码、头文件、资源文件、配置等。一个方案中可以有多个项目,每个项目可以单独编译和运行。

源程序Source Code
源程序是项目中的实际代码文件,通常是 .cpp、.h 等文件。源程序文件包含具体的代码逻辑,是我们编写和调试的地方

3.2 同一个项目中包含多个 .cpp 文件,多个 main() 函数问题

在 C++ 中,每个可执行项目只能有一个 main() 函数,这是程序的入口点。如果一个方案包含多个项目,并且每个项目的源文件都有 main() 函数,这是完全可以的,因为每个项目是独立编译的。

但是,如果在同一个项目中包含多个 .cpp 文件,并且这些文件中都有 main() 函数,就会导致编译错误,因为编译器无法确定哪个 main() 是程序的入口。这个时候,需要把多余的与项目无关的cpp从项目中移除。

3.3 直接从文件资源管理器中双击 .cpp 的问题

杂项文件

当你从文件资源管理器中直接打开一个 .cpp 文件(例如 first.cpp),Visual Studio 只会打开这个文件,并不会把它放入一个项目或方案中管理。
这时候,Visual Studio 认为这个文件是一个杂项文件,因为它不属于当前打开的任何项目和方案,所以无法进行编译、调试或运行。
在这里插入图片描述

解决方法

方法一:应当打开的是方案文件(上图中的cpp1.sln),这样 Visual Studio 就会载入方案及其所有的项目。
方法二:一般情况,你看看 first.cpp 属于哪个项目,如果它没有被包含在任何项目中,也可以手动将其添加到合适的项目中。通过方案资源管理器(Solution Explorer),找到对应的项目,右键点击项目名称,选择“添加” -> “现有项”,然后将 first.cpp 添加进来。

3.4 入门练习源码简单,如果不想为每一个练习都新建一个项目

可以使用以下几种方法来管理多个 .cpp 文件

方法 1:使用一个项目管理多个 .cpp 文件,但只运行一个 main() 函数

只需要新建一个 C++ 项目(如“LIANXI”),然后在这个项目中添加多个 .cpp 文件。
每个 .cpp 文件可以是一个独立的练习程序。

但是需要管理 main() 函数,使得同一时间只能有一个 main() 函数被编译,因此每次运行一个练习时,需要确保其他的 .cpp 文件中的 main() 函数被注释掉,或者重命名为其他函数(例如 main1())

// file1.cpp
int main() {
    // 练习代码 1
    return 0;
}

// file2.cpp
// int main() { // 注释掉或者重命名
//     // 练习代码 2
//     return 0;
// }

如果你想运行另一个 .cpp 文件中的代码,只需注释掉当前 main(),然后启用你想运行的文件中的 main()。

方法 2:使用条件编译切换不同的 main() 函数

可以通过条件编译的方式来选择性地运行某个文件的 main() 函数。为每个 .cpp 文件添加条件编译宏,然后用宏来控制哪个 main() 函数被编译。
File1.cpp

#ifdef RUN_FILE1
#pragma message("Compiling file1.cpp with RUN_FILE1 defined")

#include<iostream>
using namespace std;
int main()
{
	cout << "file1.cpp" << endl;
	return 0;
}
#endif

File2.cpp

#ifdef RUN_FILE2
#pragma message("Compiling file2.cpp with RUN_FILE2 defined")
#include<iostream>
using namespace std;
int main()
{
	cout << "file2.cpp" << endl;
	return 0;
}

#endif

在项目设置中定义宏
右键项目 -> 属性 -> C/C++ -> 预处理器 -> 预处理器定义。

在预处理器定义中,根据要运行的文件,添加 RUN_FILE1 或 RUN_FILE2,配置调整为“Debug”
例如:如果要运行 file1.cpp 中的 main() 函数,添加 RUN_FILE1。如果要运行 file2.cpp 中的 main() 函数,添加 RUN_FILE2。

根据设置的预处理器定义,编译时只有符合条件的 main() 函数会被编译,其它文件中的 main() 函数会被忽略。运行项目时,会执行被编译的 main() 函数。

例如
添加 RUN_FILE1,
在这里插入图片描述

运行后,会执行 file1.cpp 中的 main(),忽略file2.cpp 的 main()
这样,你可以控制哪个文件的 main() 函数参与编译和执行,无需不断地注释和取消注释代码
但是每次运行要设置,也是蛮麻烦的

方法 3:将不需要编译的文件设置为“排除生成”

在项目属性中将不需要运行的 .cpp 文件设置为“排除生成”来避免编译冲突
右键点击 不需要编译的 .cpp 文件(例如 File1.cpp),从右键菜单中选择 “属性”(Properties)
在属性窗口中,展开左侧的 配置属性 (Configuration Properties)。
点击 常规 (General)。
找到 排除生成 (Exclude from Build) 选项。
将 排除生成 (Exclude from Build) 设置为 “是 (Yes)”。
点击“应用”或“确定”以保存设置。
在这里插入图片描述
在这里插入图片描述
通过排除不需要编译的文件,控制哪些代码参与编译,避免多重 main() 函数导致的冲突

方法 4:使用一个项目管理一个 .cpp 文件,只运行一个 main() 函数

将每个源代码单独保存在记事本中,起好文件名,需要运行哪个,就打开贴哪个源代码到文件中,编译运行

4. 寻找当前项目在硬盘上的保存位置

在这里插入图片描述

5. 找不到界面右侧的 “解决方案资源管理器”窗口了

如果看不到这个窗口了,在菜单栏“视图”里面找
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dotdotyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值