• 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。

  • 相关阅读:
    React源码深度解析视频 某课网(完整版)
    解决VueRoter/element-ui路由报错Error: Avoided redundant navigation to current location的问题
    package-lock.json的作用
    encodeURI()和encodeURIComponent() 区别
    Webpack HMR 原理解析
    Kibana详细入门教程
    大数据可视化(万物互联)
    ES11来了,有些新特性还是值得一用的!
    Prometheus(普罗米修斯)——适合k8s和docker的监控系统
    linux安装pm2
  • 原文地址:https://www.cnblogs.com/libcan/p/3877602.html
Copyright © 2020-2023  润新知