最近在看C Primer Plus 12.5章节,发现一段样例代码使用的全局变量,再次记录一下
简而言之:
1. 在.c源文件定义全局变量
2. 在.h头文件用extern声明这个全局变量
3. 如果其他.c文件需要使用这个全局变量,只要包含头文件就可以了,不用在c文件重新extern声明这个变量,extern声明可以有无限多个,头文件有一个就够用了!
总结下:(拷贝之前博文的内容)
对变量而言,如果你想在本源文件中使用另一个源文件的变量,就需要在使用前用extern声明该变量,或者在头文件中用extern声明该变量;
对函数而言,如果你想在本源文件中使用另一个源文件的函数,就需要在使用前用声明该变量,声明函数加不加extern都没关系,所以在头文件中函数可以不用加extern。
C程序采用模块化的编程思想,需合理地将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求,在模块的划分上主要依据功能。模块由头文件和实现文件组成,对头文件和实现文件的正确使用方法是:
规则1 头文件(.h)中是对于该模块接口的声明,接口包括该模块提供给其它模块调用的外部函数及外部全局变量,对这些变量和函数都需在.h中文件中冠以extern关键字声明;
规则2 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;
规则4 如果要用其它模块定义的变量和函数,直接包含其头文件即可。
许多程序员喜欢这样做,当他们要访问其它模块定义的变量时,他们在本模块文件开头添加这样的语句:
extern int externVar;
抛弃这种做法吧,只要头文件按规则1完成,某模块要访问其它模块中定义的全局变量时,只要包含该模块的头文件即可。
diceroll.c
#include "diceroll.h" #include <stdio.h> #include <stdlib.h> int roll_count = 0; // 定义全局变量 static int rollem(int sides) { int roll; roll = rand() % sides + 1; ++roll_count; return roll; } int roll_n_dice(int dice, int sides) { int d; int total = 0; if (sides < 2) { printf("need at least 1 die. "); return -2; } if (dice < 1) { printf("need at lease 1 die. "); return -1; } for (d = 0; d < dice; d++) { total += rollem(sides); } return total; }
diceroll.h
extern int roll_count;//全局变量 声明 int roll_n_dice(int dice, int sides);
manydice.c
#include<stdio.h> #include<stdlib.h> #include<time.h> #include "diceroll.h" //为 函数roll_n_dice()提供原型,为变量roll_count提供声明 int main() { int dice, roll; int sides; srand((unsigned int)time(0)); printf("enter the number of sides per die, 0 to stop. "); while (scanf_s("%d", &sides) == 1 && sides > 0) { printf("how many dice? "); scanf_s("%d", &dice); roll = roll_n_dice(dice, sides); printf("you have rolled a %d using %d %d-sided dice. ", roll, dice, sides); printf("how many sides? enter 0 to stop. "); } printf("the rollem() func was called %d times. ", roll_count); //使用外部变量 printf("good fortune to you! "); return 0; }