zoukankan      html  css  js  c++  java
  • C语言零碎记录之extern

    最近遇到了一个问题,就是一个头文件有一个static的变量,编译的文件有几个.o的,他们都引用了这个头文件,但是当打印出这个变量(经过修改了)的值得时候,居然不一样,打印出地址来,地址居然也不一样。两个不同地址,一个相同的变量名?究竟怎么回事情呢???

    这个变量许多文件要用。但是放到h文件,又是个问题啊。。。

    使用extern 声明外部变量,必须符合下面的情况

    生成的.o 不能引用包括这个变量定义的文件。但是我又使用了这个头文件的其他函数,郁闷了。

    经过试验 应是这样的,变量 不要用static,因为外部要extern使用,反而不能用static了 才郁闷呢。

    实验如下:

    head1.h

    #include <stdio.h>
    extern int str_i;

    head1.c

    #include "head1.h"
    int str_j=5;
    int main(){
    printf("str_i=%d\n",str_i);
    func();
    printf("str_i=%d\n",str_i);

    }

    head2.h

    #include <stdio.h>
    extern int str_j;
    int str_i=1;
    void func();

    head2.c

    #include "head2.h"
    void func(){
    str_i=999;
    printf("str_j=%d\n",++str_j);
    }



    编译方法为:

    gcc -c head1.c
    gcc -c head2.c
    gcc -o main head1.o head2.o

    或者

    gcc -c head2.c
    gcc -o main head1.c head2.o

    结果如下:

    $ ./main

    str_i=1

    str_j=6

    str_i=999

    head2 要使用的资源使用了

    head1 要使用的资源也使用了。

    但是head1不能使用head2的头文件,否则重复定义。

    head2也不能使用head1的头文件,否则重复定义。

    看来 使用 别人的东西,不一定要加 头文件的。函数声明 也没必要,只要在GCC中有对应的。o或lib就可以了。





     

    转载请注明出处:http://www.cnblogs.com/ayanmw 多谢

    ------------------------------------------------------------------------------------------------

    一定要专业!本博客定位于 ,C语言,C++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。. linux,总之后台开发多一点。以后也愿意学习 cocos2d-x 游戏客户端的开发。

  • 相关阅读:
    Java发送HTTP的Get 和 Post请求
    vue 中使用 Ant Design 依次提供了三级选项卡
    Postman中不为人知的秘密 之 设置全局变量,token
    vue组件之间传值(03)__兄弟组件传值,事件总线[ EventBus ]
    元素内部滚动到底部和顶部的监听
    如何将三个数的颜色色值兼容成六个数的方法
    前端内容的自动化构建
    模拟vue实现简单的webpack打包
    VXcode学习
    npm install 成功安装依赖后,运行跑不起来怎么办?
  • 原文地址:https://www.cnblogs.com/ayanmw/p/2371452.html
Copyright © 2011-2022 走看看