LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 962|回复: 3

全局变量?好象不全局呀?没想明白到底是怎么回事

[复制链接]
发表于 2007-8-16 10:56:34 | 显示全部楼层 |阅读模式
头文件定义了一个全局变量

  1. /*
  2. head.h
  3. */
  4. #ifndef _m_HEAD_H
  5. #define _m_HEAD_H

  6. static int flag = 0;

  7. #endif
复制代码

信号处理头文件

  1. /*
  2. ctest.h
  3. */
  4. #define _m_CTEST_H

  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. void signal_init();
  9. void signal_action(int);
  10. #ifdef __cplusplus
  11. }
  12. #endif
  13. #endif

复制代码

信号处理源文件

  1. /*
  2. ctest.c
  3. */
  4. #include <stdio.h>
  5. #include <signal.h>
  6. #include <unistd.h>
  7. #include "ctest.h"
  8. #include "head.h"

  9. extern int flag;

  10. void signal_init()
  11. {
  12.         signal(17, signal_action);
  13. }

  14. void signal_action(int i)
  15. {
  16.         printf("b: %d\n", flag);
  17.         printf("action\n");
  18.         flag = 10;
  19.         sleep(10);
  20.         printf("b2: %d\n", flag);
  21. }
复制代码

主程序

  1. /*
  2. main.cpp
  3. */
  4. #include "head.h"
  5. #include "ctest.h"
  6. #include <iostream>
  7. #include <unistd.h>

  8. extern int flag;

  9. int main()
  10. {
  11.         signal_init();

  12.         flag = 1;

  13.         while(flag > 0)
  14.         {
  15.                 std::cout << "flag: " << flag << std::endl;
  16.                 sleep(5);
  17.         }

  18.         return 0;
  19. }
复制代码

编译

  1. cc -c ctest.c -o ctest.o
  2. c++ -c main.cpp -o main.o
  3. c++ main.o ctest.o -o main
复制代码

  1. root@yxm:~/c++/test# ./main &
  2. [1] 2657
  3. flag: 1
  4. root@yxm:~/c++/test# ps
  5.   PID TTY          TIME CMD
  6. 2264 pts/6    00:00:00 bash
  7. 2657 pts/6    00:00:00 main
  8. 2658 pts/6    00:00:00 ps
  9. root@yxm:~/c++/test# flag: 1
  10. flag: 1
  11. flag: 1
  12. kill -17 2657
  13. root@yxm:~/c++/test# b: 0          [color="DarkOrchid"]注:怪异处一[/color]
  14. action
  15. b2: 10
  16. flag: 1          [color="DarkOrchid"]注:怪异处二[/color]
  17. flag: 1
  18. kill -17 2657
  19. root@yxm:~/c++/test# b: 10 [color="DarkOrchid"]注:怪异处三[/color]
  20. action
  21. b2: 10
  22. flag: 1
  23. flag: 1

复制代码


全局变量怎么在每个函数里有自己的值?
发表于 2007-8-16 15:13:02 | 显示全部楼层
因为你把变量的定义写在了头文件中,这样 ctest.c 和 main.cpp 里都有一行 static int flag = 0; 这个 flag 就在两个文件中都有了。
回复 支持 反对

使用道具 举报

发表于 2007-8-16 15:22:26 | 显示全部楼层
全局的static只在每个compilation unit里可见
所以你这样定义的话,每个包含此头文件的.c里都有一个独立的flag
头文件里只有声明就好了,不要放定义
只把flag定义在一个.c里,且不要加static
回复 支持 反对

使用道具 举报

发表于 2007-8-16 16:47:38 | 显示全部楼层
建议楼主看看 static/extern 的含义。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表