zoukankan      html  css  js  c++  java
  • MFC学习随笔(2)

      在MFC中,有时需要多个类之间传递信息,一个共通的头文件是个不错的选择。如果在头文件中直接声明一个变量的话,势必会报出一个错误:

      error LNK2005: "struct my_global global_data" (?global_data@@3Umy_global@@A) already defined in MFCApplication1Dlg.obj

      不对呀,我明明是在头文件声明的,不同的文件中的变量应该是同一个啊,怎么还重定义了呢?

      反复查证之后,原来是自己对头文件的理解一直有错误。

      引用一篇好文:http://www.oschina.net/question/253403_44866?sort=time

      摘要部分如下:

      “楼主的问题,是对头文件作用不太了解造成了。头文件本质只是个文本。连源文件都算不上。有些编译器会对.h文件做写特殊化的处理。

      但是希望你理解,.h头 文件自身没有意义,有意义的是#include ,你参考我下面的一个代码例子,不知道你是否能理解,我用C写的,

      C++也基本一样,在使用 #include方面。”

        

    //这是一个很简单的程序,就一个main.c函数
    #include <stdio.h>
    int main(int argc ,char *argv[]){
       printf("hello world!
    ");
       return 0;
    }
    //我把上面修改一下,新生成两个文本文件,printf_hello_world.txt ,return.txt
    //printf_hello_world.txt里面的内容就一行
    printf("hello world!
    ");
     
    //return.txt里面的内容也就一行
    return 0;
     
    //同时修改main.c文件如下
    #include <stdio.h>
    int main(int argc ,char *argv[]){
    #include "printf_hello.world.txt"
    #include "return.txt"
    }

      "你可以发现,修改后的代码和原始代码运行是一个结果。准确说,对编译器而言,是完全一样的内容。

      #include只是将后面的文件,插入到当前的文本中。其实和.h无关。

      而你将一个函数写在.h里面当多个文件均#include时,则这个函数对于多个文件,再编译器看来,每个文件都存在完全相同的函数

      (只要函数定义 相同就会有冲突)。而C语言或C++,默认对每个函数是可作为外部函数的。此时,连接器就会混乱。究竟连接哪

      个文本(源文件)所编译对应的函数。

      你可以把函数写在头文件里,但需要增加static 前缀。此时这个函数就会在每个#include该头文件的源文件中存在,由于是static,

      对于函数是局部的意思,此时,外部就无法  调用到该函数,最多会出现”找不到该函数的连接错误“而不会说函数重复存在的问题。"

      自然,如果我在头文件中声明变量直接引用的话,就会造成变量重定义的错误。那么该如何正确使用头文件呢?对于函数,我们使用static,对于变量,我们则使用extern。

      具体方法如下:

      在头文件中,添加extern变量:

    extern my_global global_data;

      在主对话框中,再次声明该变量:

    my_global global_data;

      那么在所有文件中,只要引入头文件,就可以调用该变量了。

      extern的使用是一个基础知识,搞得我昏头昏脑,很是惭愧= = 头文件的正确打开方式则是个意外收获,曰:nice。

  • 相关阅读:
    [LeetCode] Implement Stack using Queues
    [LeetCode] String Compression
    [国嵌攻略][060][LCD工作原理解析]
    [国嵌攻略][059][2440-DMA程序设计]
    [国嵌攻略][057][串口控制台建立]
    [国嵌攻略][056][串口驱动程序设计]
    [国嵌攻略][054][NandFlash驱动设计_写]
    [问题笔记][指针相加翻译成汇编右移2位]
    [国嵌攻略][053][6410和210按键中断编程]
    [国嵌攻略][050][2440按键中断编程]
  • 原文地址:https://www.cnblogs.com/libcan/p/3877602.html
Copyright © 2011-2022 走看看