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. 找不到界面右侧的 “解决方案资源管理器”窗口了
如果看不到这个窗口了,在菜单栏“视图”里面找