none
多个cpp文件包含一个头文件问题 RRS feed

  • 问题

  •  

    common.h  是一个头文件

    另外二个单独的cpp文件包含它, 会出错, 为什么?


    common.h 内容如下:

    #if !defined(AFX_DLG1_H__9C629610_CC2F_8888_9F5A_BE0936078888__INCLUDED_)
    #define AFX_DLG1_H__9C629610_CC2F_8888_9F5A_BE0936078888__INCLUDED_


    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000

    struct ShellPara_s { 
     int  iLanguage;
     int  iVolume;
     int  iBacklight;
    };

    ShellPara_s sPara;

    #endif // !defined(AFX_DLG1_H__9C629610_CC2F_8888_9F5A_BE0936078888__INCLUDED_)

    2008年6月3日 6:36

答案

  • 呵呵,严格上来说,这个跟本版主题没有关系。是编程语言的内容。

     

    就当一次C语言老师把。

     

    C语言里面,定义(defination)和声明(declaration)这两个概念我们必须严格区分,结构体的声明,类的声明可以声明多次,但是对于某一个变量定义只能定义一次,如果定义多次,那就是redefination error。

     

    对于你上面的例子,把这个头文件include到多个cpp里面,所以这个头文件会被编译多次。对结构体的声明,多次不要紧,只要每次都一样,但是后面那句,就是通过这个结构体定义了一个变量。如果在头文件里面定义了变量,编译器多次编译的时候觉得没问题。但是链接的时候,链接器就会觉得,这个变量怎么被定义了两次,而且名字都一样?到底程序员要在内存里面维护两个变量还是一个变量?他就糊涂了,所以就报错了,只能问你怎么办。

     

    正确的方法是在某一个cpp里面定义这个全局变量,然后另一个cpp里面使用extern keyword把它extern进来。

     

    2008年6月11日 20:04
    版主

全部回复

  •  

    2008年6月3日 8:04
  •  

    up
    2008年6月3日 9:40
  • 在EVC环境下

     

    common.h  是一个头文件

    另外二个单独的cpp文件包含它, 会出错, 为什么?


    common.h 内容如下:

    #if !defined(AFX_DLG1_H__9C629610_CC2F_8888_9F5A_BE0936078888__INCLUDED_)
    #define AFX_DLG1_H__9C629610_CC2F_8888_9F5A_BE0936078888__INCLUDED_


    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000

     

    struct ShellPara_s { 
     int  iLanguage;
     int  iVolume;
     int  iBacklight;
    };

     

    ShellPara_s sPara;   //------------------定义一个结构变量. 屏蔽这一句,不会出错.,想知道为什么?

     

    #endif // !defined(AFX_DLG1_H__9C629610_CC2F_8888_9F5A_BE0936078888__INCLUDED_)


     

    2008年6月4日 1:26
  • 呵呵,严格上来说,这个跟本版主题没有关系。是编程语言的内容。

     

    就当一次C语言老师把。

     

    C语言里面,定义(defination)和声明(declaration)这两个概念我们必须严格区分,结构体的声明,类的声明可以声明多次,但是对于某一个变量定义只能定义一次,如果定义多次,那就是redefination error。

     

    对于你上面的例子,把这个头文件include到多个cpp里面,所以这个头文件会被编译多次。对结构体的声明,多次不要紧,只要每次都一样,但是后面那句,就是通过这个结构体定义了一个变量。如果在头文件里面定义了变量,编译器多次编译的时候觉得没问题。但是链接的时候,链接器就会觉得,这个变量怎么被定义了两次,而且名字都一样?到底程序员要在内存里面维护两个变量还是一个变量?他就糊涂了,所以就报错了,只能问你怎么办。

     

    正确的方法是在某一个cpp里面定义这个全局变量,然后另一个cpp里面使用extern keyword把它extern进来。

     

    2008年6月11日 20:04
    版主
  • 当老师的就是耐心:-)

    我也经常有类似的应用,你可以在头文件里用extern keyword方式定义,在主CPP里直接定义keyword。要保证所有要连接的文件里仅有一个直接定义keyword的变量,其它都要添加上extern关键字。

     

     

    2008年6月12日 1:33
    版主
  • 何宗键老师是一个学者型的版主, 知识全面,讲解的详细和准确,谢谢.

     

    2008年6月12日 1:39