我在a.h中写了一个函数(直接把函数写在.h中,没有用cpp)然后我把这个a.h包含到stdafx.h中再在其它地方调用a.h中的函数,结果出现重定义错误。我把函数声明写在a.h,定义写在cpp文件里就没有问题了。请问为什么?

解决方案 »

  1.   

    H文件在编译时会被直接插入到CPP文件中去的,你的a.h被包含了多次,那么这个函数就相当于有多个实现,当然会重定义了。
      

  2.   

    tks.
    可是我在.h里定义的类为什么就没事呢?
      

  3.   

    可是类里面也有函数的定义啊。
    你说:H文件在编译时会被直接插入到CPP文件中去的。
    那类不是要重定义了。
      

  4.   

    #ifndef _MYSTACK_H
    #define _MYSTACK_H
      

  5.   

    正解。
    或者用楼上的:#pragma once
    避免二次包含。
    尤其:如果你想把全局 变量放在头文件里,那就彻底错了,而且出现的问题异常诡异!
    千万不要把全局非静态变量放在头文件里。不然很可能发现2个cpp文件里面修改的变量互相不可见!
    当然了,常量是没问题的,因为你不改变它。最好用下面的方法:
    //*.h 头文件里声明,不定义,函数也一样。只申明。
    extern int a ;//*.cpp//在CPP文件里面定义,这样在链接的时候能够找到,
    //而且不会发现不同CPP里面用的是不同的副本,编译速度会更快。可执行文件也应该更小。
    int a = 0;
      

  6.   

    #pragma once用了,没有效果
      

  7.   

    这样确实是可以,但在我的工程里就会多一个CPP文件。
    因为不想太多的文件,所以想直接写在H里
      

  8.   

    在H中定义的函数,别实现它,就是别写上{},就不会出现你这个问题了。出了问题,可以用上面的方法。你也完全可以写在一个CPP中,然后在其它CPP想调用的时候,声明一下(extern),就行了。