<iostream.h>和<iostream>的区别,以及using namespace等
1、使用std命名空间中的东西,需要#include <iostream>,还有一个可疑的<iostream.h>是什么呢?
<iostream.h>是为了兼容以前的C++代码,相当于在C中调用库函数,使用全局namespace,不加using namespace std那句也识别std中的名称。<iostream>是为了支持新的标准,新标准规定C++头文件不加.h。<iostream>中没有定义全局命名空间,必须using std;这样才能正确使用C++标准程序库中的所有标识符。
2、关于命名空间
using namespace std; /*暴露std的全部名称 保证在本句之后的区域中可以直接使用叫做std的名字空间的全部成员 原本需要输入std::xxx的,可以直接输入xxx来使用*/ /*std指C++标准程序库 C++标准程序库中的所有标识符都被定义于一个名为std的namespace中(standard) */ //为防止命名污染,更常用的是以下形式: using std::cout; using std::endl;
头文件中不要用using声明,会弄得到处都是的。
常见的:类的定义在引用标准库内容时完整地使用 std:: 限定符。
❤看到.h的第一反应是到处都是
为什么不要把全局变量/函数定义写在.h里?
把定义写在.h里,.h被多处包含的话,就会引发重复定义。 可爱的连接错误error LNK2005就出现了。
尽管一个全局变量或函数可以(在多个编译单元中) 有多处“声明”, 但是“定义” 却只能允许出现一次。定义是分配空间并赋初值(如果有) 的声明。最好的安排是在某个相关的.c 文件中定义, 然后在头文件(.h) 中进行外部声明, 在需要使用的时候, 只要包含对应的头文件即可。定义变量的.c 文件也应该包含该头文件, 以便编译器检查定义和声明的一致性。
把全局变量定义写在.h里。然后,在全局变量前加 __declspec(selectany) 。 就是有重复定义 但是随便选一个的意思。。不会再报告重复定义的连接错误了。。。据说整模板的人 会这么用 比较方便 呵呵 用的不多。。有待考证。
同样的,using [namespace] XXX 也不用在.h里,会“到处都是”的,引起名字空间污染不在话下。
3、using还有其他用处
class Base { public: std::size_t size() const { return n; } protected: std::size_t n; }; class Derived : private Base { //private继承 public: // maintain access levels for members related to the size of the object using Base::size; //可以使用 using 声明访问基类中的名字 恢复到基类中的访问级别 protected: using Base::n; // ... }; -C++ Primer ver.4-