当前位置:  技术问答>linux和unix

使用make时发现的一个值得小心的问题(新鲜出炉)!!!

    来源: 互联网  发布时间:2015-09-13

    本文导语:  这个问题是我刚刚在工作中碰到的。  比如下列小程序:  代码: /******************************************/  #include   static char *head;  void change(char *);  /******************************************/  int  main(void)  {         char n...

这个问题是我刚刚在工作中碰到的。 
比如下列小程序: 
代码:
/******************************************/ 
#include  

static char *head; 

void change(char *); 
/******************************************/ 
int 
main(void) 

       char name[] = "XiongBin Xiong.n"; 
       char *p; 

       p = name; 
       head = p; 

       printf("main()_1:%s",head); 

       change(p); 

       printf("main()_2:%s",head); 

       exit(0); 

/********************************************/ 
void 
change(char *ptr) 

       char *q; 

       q = ptr; 
       q = q + 5; 
       head = q; 

       printf("change():%s",head); 

/*******************************************/ 

就一个文件,直接gcc编译,运行,输出结果为: 
main()_1:XiongBin Xiong. 
change():Bin Xiong. 
main()_2:Bin Xiong. 
当按照文中标示分为3个文件ourh.h,main.c,change.c使用make进行编译,运行,输出结果为: 
main()_1:XiongBin Xiong. 
change():Bin Xiong. 
main()_2:XiongBin Xiong. 
两者输出结果是不一样的。 
我现在的认为是,程序段分开编译时,对于一个函数中全局变量的改变不能引起其他函数中该变量的值的变化。但到底里头是怎么一回事,到底有什么规则呢?我还不知道/。 
有待学习。请各位高手指点。

|
这个问题应该是编译的问题,你肯定是编译成2个.O。然后链接的。
你的static char *head; 是在头文件中的,所以编译的时候是有2个全局的head量,分别在2个.O里面。因为本.O已经找到了这个变量的申明所以不会在编译的时候报重复申明。
你可以试一下吧头文件的去掉,然后再main.c头上加上static char *head;在change.c头上加上 extern static char *head;就应该对了

|
楼主对static的全局变量不够了解
static char *head。在一个c文件里出现一次,就分一个空间。在头文件里被包含
用nm查看可知
 # nm a.out
080495f0 A __bss_start
080482d0 t call_gmon_start
080483d0 T change
080495f0 b completed.1
080495c4 d __CTOR_END__
080495c0 d __CTOR_LIST__
080494ec D __data_start
080494ec W data_start
08048468 t __do_global_ctors_aux
080482f4 t __do_global_dtors_aux
080494f0 D __dso_handle
080495cc d __DTOR_END__
080495c8 d __DTOR_LIST__
080494f8 D _DYNAMIC
080495f0 A _edata
080484e8 r __EH_FRAME_BEGIN__
080495fc A _end
         U exit@@GLIBC_2.0
0804848c T _fini
080494ec A __fini_array_end
080494ec A __fini_array_start
080484a8 R _fp_hw
08048330 t frame_dummy
080484e8 r __FRAME_END__
080495d4 D _GLOBAL_OFFSET_TABLE_
         w __gmon_start__
-----------------------
080495f4 b head
---------------------
080495f8 b head
----------------------
08048254 T _init
080494ec A __init_array_end
080494ec A __init_array_start
080484ac R _IO_stdin_used
080495d0 d __JCR_END__
080495d0 d __JCR_LIST__
         w _Jv_RegisterClasses
08048434 T __libc_csu_fini
08048404 T __libc_csu_init
         U __libc_start_main@@GLIBC_2.0
0804835c T main
080494f4 d p.0
         U printf@@GLIBC_2.0
080482ac T _start

|
昨晚的回复没了:(¥#%#
在模块内部有效

|
和make根本就没有关系
实际上就是一个head变量和两个head变量的问题

|
不过.h中是用extern char *head;main中是用char *head;
不能加static,加了编译不过,
gcc -c main.c
In file included from main.c:1:
test.h:3: multiple storage classes in declaration of `head'
*** Error code 1
不知道为什么?
================================================================
我想是因为你既然已经定义了 static char *head; 那么 head 这个符号就不可以被其它模块引用,你如果又在头文件中声明 extern char* head,就成为一个矛盾。

|
it's none of the business of make, it's your programming error.

|
静态变量好像是局部有效的吧,好像是不可以在其它文件中调用

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • Jsp可否使用带有GUI的JavaBean,如何使用?
  • c/c++预处理命令预#,##使用介绍
  • asp程序使用的access在Linux下如何使用!
  • 在div中使用css让文字底部对齐的方法
  • 新装的Linux使用root用户不能使用FTP?
  • Python namedtuple(命名元组)使用实例
  • LINUX下使用Eclipse,如何使用交叉编译器?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3