例如,小李和小韩都参与了文件管理系统的开发。 他们都定义了一个全局变量fp来指示当前打开的文件。 将他们的代码整合在一起编译时,很明显编译器会提示fp ()错误。
为了解决协作开发时的命名冲突问题,cpp引入了()的概念。 请看下面的例子:
namespace Li{ //小李的变量定义
FILE fp = NULL;
}
namespace Han{ //小韩的变量定义
FILE fp = NULL
}
小李与小韩各自定义了以自己姓氏为名的命名空间,此时再将他们的 fp 变量放在一起编译就不会有任何问题。
它是C++中的关键字,用于定义命名空间。 语法格式为:
namespace name{
//variables, functions, classes
}
name是命名空间的名称,可以包含变量、函数、类、#等,最后用{}包围。
使用变量和函数时,请指定它们所在的命名空间。 以上面的 fp 变量为例,可以这样使用:
Li::fp = fopen("one.txt", "r"); //使用小李定义的变量 fp
Han::fp = fopen("two.txt", "rb+"); //使用小韩定义的变量 fp
:: 是一个称为域解析运算符的新符号,在 C++ 中用于指示要使用的命名空间。
除了直接使用域解析运算符之外,还可以使用using关键字声明,例如:
using Li::fp;
fp = fopen("one.txt", "r"); //使用小李定义的变量 fp
Han :: fp = fopen("two.txt", "rb+"); //使用小韩定义的变量 fp
Li::fp 在代码开头使用 using 进行声明。 意思是,如果using声明后程序中出现没有指定命名空间的fp,则将使用Li::fp; 但如果你想使用小韩定义的fp,仍然需要Han::fp。
using语句不仅可以针对命名空间中的变量,还可以用于声明整个命名空间,例如:
using namespace Li;
fp = fopen("one.txt", "r"); //使用小李定义的变量 fp
Han::fp = fopen("two.txt", "rb+"); //使用小韩定义的变量 fp
如果命名空间Li中定义了其他变量,它们也将具有fp变量的作用。 using声明后,如果与未指定命名空间的变量发生命名冲突,则默认使用命名空间Li中的变量。
不仅变量可以在命名空间内声明或定义,其他可以在命名空间外声明或定义的名称也可以在命名空间内声明或定义。 例如类、函数、#等都可以出现在命名空间中。 中间。
从编译链接的角度来看,代码中出现的变量名、函数名、类名等都是符号()。 有些符号可以引用内存位置,例如变量名和函数名; 有些符号只是一个新名称,例如定义的类型别名。
我们来看一个命名空间的完整示例代码:
#include
//将类定义在命名空间中
namespace Diy{
class Student{
public:
char *name;
int age;
float score;
public:
void say(){
printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
}
};
}
int main(){
Diy::Student stu1;
stu1.name = "小明";
stu1.age = 15;
stu1.score = 92.5f;
stu1.say();
return 0;
}
运行结果:
小明的年龄是 15 岁,他的分数是 92。
早期的C++并不完美,不支持命名空间,也没有自己的编译器。 相反,C++代码被翻译成C代码,然后通过C编译器进行编译。 此时C++仍然使用C语言库,stdio.h、.h、.h等头文件仍然有效; 另外,C++还开发了一些新的库并添加了自己的头文件,例如:
与C语言一样,C++头文件仍然带有.h后缀,并且它们包含的类、函数、宏等都是全局范围的。
后来,C++引入了命名空间的概念,并计划重写库,将类、函数、宏等整合到一个命名空间中。 这个命名空间的名称是std。 std 的意思是“标准命名空间”。
但此时,已经有很多用老式C++开发的程序,它们的代码不使用命名空间。 直接修改原有的库会带来非常严重的后果:程序员不会愿意花大量的时间修改旧的代码。 并强烈抵制并拒绝使用新标准C++代码。
C++开发人员想到了一个好办法,保留原来的库和头文件,可以继续在C++中使用,然后将原来的库复制一份,然后稍微修改一下,添加类、函数、宏等。合并到命名空间std中,它成为C++标准库的新版本。 这样就存在了两个功能相似的库。 使用旧C++的程序可以继续使用原来的库,新开发的程序可以使用新版本的C++库。
为了避免头文件重名,新版本的C++库还调整了头文件的命名,去掉了后缀.h,所以旧C++的.h变成了.h。 对于原来的C语言头文件,也是用同样的方法,只是在每个名字前加上ac字母,所以C语言的stdio.h就变成了,.h就变成了。
需要注意的是,旧的C++头文件官方反对使用,已经明确表示不再支持,但旧的C头文件仍然可以使用,以保持与C的兼容性。事实上,编译器开发人员不会停止为客户现有的软件提供支持,预计未来几年仍将支持旧的 C++ 头文件。
以下是我对C++头文件现状的总结:
1) 旧的 C++ 头文件,如 .h、.h 等将继续受支持,尽管它们不在官方标准中。 这些头文件的内容不在命名空间 std 中。
2)新的C++头文件,如 等,包含与相应旧头文件类似的基本功能,但头文件的内容位于命名空间std中。
注意:在标准化过程中,库的某些部分的一些细节已被修改,因此旧头文件和新头文件不一定完全对应。
3) 继续支持stdio.h、.h等标准C头文件。 头文件的内容不在std中。
4) 带有 C 库函数的新 C++ 头文件的名称如下: 它们提供与相应的旧 C 头文件相同的内容,只不过内容位于 std.h 中。
可以发现,对于没有.h的头文件,所有符号都位于命名空间std中,使用时需要声明命名空间std; 对于带有 .h 的头文件,不使用命名空间,所有符号都位于全局角色中。 区域。 C++标准也规定了这一点。
使用 C++ 头文件
虽然C++几乎完全兼容C语言,但C++中仍然支持C语言头文件,但C++中的新库更加强大和灵活。 请读者尝试使用这些新的C++头文件,例如,等等。
在前面的章节中,我们使用了C语言格式输出函数,引入了C语言头文件stdio.h,并将C代码和C++代码混合在一起。 我不推荐这个。 请尝试使用C++方法。 以下示例演示了如何使用 C++ 库进行输入和输出:
#include
#include
int main(){
//声明命名空间std
using namespace std;
//定义字符串变量
string str;
//定义 int 变量
int age;
//从控制台获取用户输入
cin>>str>>age;
//将数据输出到控制台
cout<
在 main() 函数中声明命名空间 std。 它的作用域位于 main() 函数内部。 如果std在其他函数中使用,需要重新声明。 请看下面的例子:
#include
void func(){
//必须重新声明
using namespace std;
cout<<"http://c.biancheng.net"<
如果您希望在所有函数中使用命名空间 std,您可以在全局范围内声明它,例如:
#include
//声明命名空间std
using namespace std;
void func(){
cout<<"http://c.biancheng.net"<
许多教程中都这样做了,并且 std 直接在所有函数外部声明。 虽然使用方便,但在中大型项目开发中不推荐使用。 这样做会增加命名冲突的风险。 我在函数内部推荐它。 声明标准。