最近在看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.\n"); return -2; } if (dice < 1) { printf("need at lease 1 die.\n"); 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.\n"); while (scanf_s("%d", &sides) == 1 && sides > 0) { printf("how many dice?\n"); scanf_s("%d", &dice); roll = roll_n_dice(dice, sides); printf("you have rolled a %d using %d %d-sided dice.\n", roll, dice, sides); printf("how many sides? enter 0 to stop.\n"); } printf("the rollem() func was called %d times.\n", roll_count); //使用外部變量 printf("good fortune to you!\n"); return 0; }