先来写一个最简单的C++程序
// helloworld.cpp
#include <iostream>
int main() {
std::cout << "Hello, Wrold!" << std::endl;
return 0;
}
这段代码反应了4个问题:
1.注释
2.预处理指令
3.main()函数
4.输入/输出流
下面主要说一下预处理指令:生成一个C++程序有三步。首先,代码在预处理器中运行,预处理器会识别代码中的元信息;随后,代码被编译成计算机可以识别的目标文件;最后,每一个目标文件链接在一起就变成了一个应用程序。预处理指令以#字符开始,如#include <iostream>,意思就是告诉预处理器:提取<iostream>头文件中的所有内容供当前文件使用。<iostream>头文件声明了C++提供的输入/输入功能,只有程序包含了此头文件,才能完成程序中想要输出的Hello,World!文本。
注意:熟悉C的同学都知道头文件是以.h结尾,比如<stdio.h>。在C++中,标准的头文件省略了.h后缀,如<iostream>,但仍然包含了C中的标准头文件,只是换了名字,比如原来的<stdio.h>变成了<cstdio>。
预处理指令还有#define、#ifdef、#ifndef、#endif等。例如:
#ifndef MYHEADER_H
#define MYHEADER_H
// ...
#endif
这是为了避免重复包含头文件的示例。
这里要提到的是,如果编译器支持#pragma once指令,则可以使用此指令代替上面的指令:
#pragma once
// ...
接下来简单说一下std::语法:std::endl代表输出流的结尾,会换行,如同\n字符。::被称为作用域解析运算符,std指的是命名空间,他们合起来使用是为了解决不同代码段之间的名称冲突问题。例如我编写了一段代码,其中定义了一个fun()函数,然而在某天,我使用了第三方库,里面恰好也定义了一个fun()函数,那么编译器则无法判断代码中调用的fun()函数到底属于哪个版本。因此我需要将自己的代码放到一个命名空间中,首先定义命名空间:
namespace mycode {
void fun();
}
当我使用fun()函数的时候,需要指明其命名空间,有两种方法:
using namespace mycode;
int main() {
fun(); // 调用的是我自己定义的fun()函数
return 0;
}
或者:
int main() {
mycode::fun(); // 调用的是我自定义的fun()函数
return 0;
}
现在就明白,cout输出流是属于std命名空间中的,所以写成std::cout。顺便提一下,输入流cin也是属于std命名空间中,至于使用方法,在此就不多提了。