vs2010入门2错误信息

错误信息: fatal error C1083: 无法打开包括文件:“iostream.h”: No such file or directory

        造成这个错误的原因在于历史原因,在过去C++98标准尚未订立的时候,C++的标准输入输出流确实是定义在这个文件里面的,这是C风格的定义方法,随着C++98标准的确定,iostream.h已经被取消,至少在VC2010下面是这样的,取而代之的是我们要用<iostream>头文件来代替,你甚至可以认为<iostream>是这样定义的:

      namespace std

      {

              #include "iostream.h"

     }

     因此我们可以简单的修改我们的Hello World。

     #include <iostream>
using namespace std;

int main()
{
cout<<"Hello World."<<endl;

return 0;
}

       iostream.h是属于C++的头文件,而非C的,因此标准订立的时候被改成了<iostream>。而C的头文件stdio.h等依然可以继续使用,这是为了兼容C代码。但是它们依然有对应的C++版本,如<cstdio> <cstdlib>等。记住,在VC2010上面采用C++风格的头文件而不是C风格的头文件,除非你是在用C。



重定义的编译错误和链接错误

     让我们在项目里面再添加一个Test.h头文件,方法是右击解决方案中的项目,添加,新建项,C++头文件,名称输入test.h。然后我们在test.h中输入:

/*#pragma once*/

void print()
{
}

      回到main.cpp中:

#include <iostream>

using namespace std;

#include "Test.h"
#include "Test.h"

int main()
{

return 0;
}

     编译一下我们会得到重定义的编译错误:

            error C2084: 函数“void print(void)”已有主体

     或许你会说,你引用(#include)了两次,我没你那么傻,我只引用一次不就好了么?是的。你聪明,但是是小聪明哈,因为你不能保证每个人都不去引用它。

     这个问题演示的是#pragma once的用处,让我们解开它的注释。编译成功!#pragma once的作用就在于防止头文件被多次引用。你或许见过

#ifndef __TEST_H__

#define__TEST_H__

代码

#endif

    这样的代码,它们的作用是一样的,如果你跟我一样懒,那么就用#pragma once,如果你打算去没有这个指令的编译器上编译代码,那么还是用后面一种方式吧




1.内联,把print声明为内联函数。

          inline void print()
         {
          }

          这个方法的好处是简单,坏处是局限性太强,意味着你总是需要公开print的实现,因为内联函数必须在编译时就知道实现才行。

      2.static,把print声明为static函数:

         static void print()。

         这便告诉编译器,哥是唯一的,而且哥只能被本编译单元的代码调用,这和extern是对应的。简单来说,想要哥帮你做事,请先include哥声明的头文件,也就是#include "test.h"。

      3..h头文件中只放声明,实现放到.cpp中去。

          现在test.h中只有void print();,而实现在test.cpp中:

        #include "Test.h"

       void print()
       {
            int a = 1;

            cout<< a++ << endl;
       }

         这个时候有意思的是我们在main.cpp无需包含test.h头文件也可以引用print函数,因为print并非static的函数:

void print();

int main()
{
print();
print();

return 0;
}


你可能感兴趣的:(c,File,include,iostream,编译器,2010)