• 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 游戏客户端的开发。

  • 相关阅读:
    单相全桥逆变电路工作过程
    单片机实用工具大全
    电路元件
    IC SPEC相关数据
    庖丁解牛,经典运放电路分析
    microstrip(微带线)、stripline(带状线) 指什么?
    [转]关于时钟线/数据线/地址线上串联电阻及其作用
    正激变换电路工作原理
    从Buck-Boost到Flyback
    [转载].关于耦合电容、滤波电容、去耦电容、旁路电容作用
  • 原文地址:https://www.cnblogs.com/ayanmw/p/2371452.html
Copyright © 2020-2023  润新知