んで、グローバル変数の定義/宣言をヘッダでする方法もあります。
その際、定義と宣言とで extern があるなしの違いしかないので、マクロを使って一つのヘッダにしてしまうと良いそうです。
# 定義用のヘッダと宣言用のヘッダを作るのはナンセンス
/* global.h */
#ifndef GLOBAL_H_INCLUDED
#define GLOBAL_H_INCLUDED
#ifdef GLOBAL_VALUE_DEFINE
#define GLOBAL
#else
#define GLOBAL extern
#endif
GLOBAL int global;
void func1(void); /* (1) */
#endif /* GLOBAL_H_INCLUDED */
/* main.c */
#define GLOBAL_VALUE_DEFINE
#include "global.h" /* extern 無し */
#include <stdio.h>
int main(void)
{
global = 0;
printf("%d\n", global);
func1();
printf("%d\n", global);
return 0;
}
/* sub.c */
#include "global.h" /* extern 有り */
void func1(void) {
global = 1;
}
詳細は
Cプログラミング診断室の
第5章をご覧ください。