zoukankan      html  css  js  c++  java
  • <iostream> 和 <iostream.h>的区别 及 Linux下编译iostream.h的方法

    0、序言

    其实2者主要的区别就是iostream是C++标准的输入输出流头文件,而iostream.h是非标准的头文件。

    标准头文件iostream中的函数属于标准命令空间,而iostream.h中的函数都是全局函数。

    #include <iostream>     //这个就是C++98标准化以后的标准头文件
    #include <iostream.h>   //这个就是标准化以前的头文件(当时还没有命令空间的概念

     

    1、两者使用时的区别

    以函数cout和endl举例说明。

    1.1 iostream.h 的使用

    由于iostream.h中函数都是全局的,使用的方法同C相同。

    //example.cpp
    #include <iostream.h> int main(void) {   cout<<"Hello World"<<endl;   return 0; }

      1.1.1 iostream.h 的编译

    在Windows平台下的VC++/VS中编译没什么好说的,直接可以编译通过.

    在Linux下编译需要详细的说明一下。

    上面的例子examplec.pp使用下面普通的方法编译,甚至提示找不到iostream.h这个头文件

    # g++ example.cpp
    error: iostream.h: No such file or directory
    error: ‘cout’ was not declared in this scope
    error: ‘endl’ was not declared in this scope

     没有头文件怎么办呢?这需要安装兼容包,在我的64位系统安装了下面2个包(还有其他包)

    # yum install compat-gcc*
    
    Install compat-gcc-34.x86_64
    Install compat-gcc-34-c++.x86_64

     记住上面包的名字中的数字34,在不同系统中可能是不同的,继续编译,注意这次使用的不是g++而是g++34.

    # g++34example.cpp
     In file included from /usr/lib/gcc/x86_64-redhat-linux/3.4.6/../../../../include/c++/3.4.6/backward/iostream.h:31, from main.cpp:8: /usr/lib/gcc/x86_64-redhat-linux/3.4.6/../../../../include/c++/3.4.6/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.

     这次编译有一个很长的warning,意思就是建议使用标准头文件不使用非标准头文件。

    非要使用非标准头文件的时候可以通过添加编译选项-Wno-deprecated 来取消这个warning

    # g++34 -g example.cpp -Wno-deprecated

     OK,到此就编译成功了。

     

    1.2 iostream 的使用

    主要有3种方法,没有最优,只有最合适

     方法1,适用于使用函数个数少,函数使用次数少 的情况

    //example1.cpp
    #include <iostream>
    
    int main(void)
    {
      std::cout<<"Hello World"<<std::endl; //方法1
      return 0;
    }

     方法2,适用于使用函数个数少,函数使用次数较多 的情况

    //example2.cpp
    #include <iostream>
    using std::cout;              //方法2
    using std::endl;              //方法2
    
    int main(void)
    {
      cout<<"Hello World"<<endl;
      return 0;
    }

     方法3,适用于使用函数个数和函数次数较多 的情况

    //example3.cpp
    #include <iostream>
    using namespace std;            //方法3
    
    int main(void)
    {
      cout<<"Hello World"<<endl;
      return 0;
    }

     

    2、建议

    最好使用标准头文件.

    iostream是现在C++中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名.h的限制,避免因为.h而造成的额外的处理和修改。

    iostream包含的基本功能和对应的旧头文件相同,但头文件的内容在名字空间std中。

    (在标准化的过程中,库中有些部分的细节被修改了,所以旧头文件和新头文件中的实体不一定完全对应。)

    一般情况下应该用这个头文件,而iostream.h则是老式的,以后有可能被淘汰。

     

    3、历史

    在回过头来看看标准程序库,这个程序库涵盖范围相当广大,提过了许许多多好用的功能。

    正是因为这样标准程序库中class的名称和函数名与第三方提供的程序库中的class名或是函数名发生名字冲突的可能性大大增大。

    为了避免这个问题的发生,标准委员会决定将标准程序库中每一样东西都放在namespace std中。

    但是这么做同时有引来了一个新的问题。很多C++程序代码依赖那些已经存在很多年的C++ “准”标准程序库(C++迟迟未标准化才导致这些情况的发生),例如iosteam.h,complex.h等等。

     为了解决这个新出现的问题,标准化委员会决定设计一些新的头文件名,给那些穿上std外衣的组件所使用。

    把C++头文件的.h去掉,于是就有前面出现的iostream,同样C的头文件也做了相同的处理,同时在前面加上了一个字母c,以表示是C的头文件(感觉上有中种族歧视的感觉)。

    同时标准化委员会声明就有的C++头文件将不再列于被支持的名单之中了,而旧有的C头文件为了满足“对C的兼容性”这个古老契约,仍然将继续存活下去。

     但是,那些编译器厂商不可能去推翻他们客户的旧有编译器(也跟本不会去这么做),所以那些旧有的C++头文件仍然苟延残喘的活了下来,并不断的扰乱那些C++新兵的心智。

     

    下面就是现在大多数C++开发工具表示头文件的组织状态:

    1.旧的C++头文件 比如iostream.h,他们虽然被标准化委员会所抛弃,但由于各大厂商为了各自的商业利益仍然将继续存活下去,这些头文件的内容将不处于namespace std中。

    2.新的C++头文件如iostream虽然提供了和旧有头文件相同的功能,但他的内容都并入了namespace std中,从而有效避免了名字污染的问题。

    3.标准C的头文件如stdio.h继续获得支持,这类文件的内容并未放在std中。

    4.C函数库的技能也有对应的新式C++版本,起名称类似cstdio,这类头文件的内容也有幸穿上了std的外衣。

     

     

    -------------------------------------------------------------------------------------------------------------------------------------------------------------

    参考资料:

    http://hi.baidu.com/laddie10/blog/item/079b1d4c32d7d8fcd62afc25.html

    http://bbs.sjtu.edu.cn/bbstcon,board,C,reid,1101133248,file,M.1101178603.A.html

     

     

     

     

     

     

     

  • 相关阅读:
    27. 为什么线程执行要调用start而不是直接run
    25. ThreadLocal的使用场景
    23. 线程如何退出结束
    20. Java字符串格式化方法
    21. 时间的格式化方法
    19. 用过spring的线程池还是java的线程池?
    17. zookeeper的实现机制,有缓存,如何存储注册服务的
    面试-spring 那些事
    Apache服务器和tomcat服务器有什么区别?
    JNDI 和JDBC的区别
  • 原文地址:https://www.cnblogs.com/LubinLew/p/cpp-iostream-and-iostream_h.html
Copyright © 2011-2022 走看看