sys.h内容 《#ifndef __SYS__H__
#define __SYS__H__
#include "a.h"
#include "b.h"
#endif》
a.h 内容《
#ifndef __A__H__
#define __A__H__
#include "sys.h"
#include "b.h"
int a;
#endif》
b.h 内容《
#ifndef __B__H__
#define __B__H__
#include "sys.h"
#include "a.h"
int b;
#endif》
c.h 内容 《int c;》
a.c 内容《 #include "sys.h" #include "a.h" #include "b.h" #include "c.h"
void func{}》
b.c 内容《
#include "sys.h" #include "a.h" #include "b.h"
#include "c.h" #include "c.h"
//预编译阶段替换各.h的内容,发现sys.h包含a.h和b.h,a.h和b.h都包含了sys.h,因为有#ifndef的作用因此在b.c中所有头文件不会重复,只有一份。同理a.c包含的头文件。由于c.h没有#ifndef因此,展开会有2个int c;但是编译并不报错,因为gcc编译器认为同一个全局变量的多次定义是合理的,会默认只初始化一个全局变量,并且extern这个全局变量,a.c中也有一个全局变量c。
int main(int argc,char **argv)
{
a=1;b=2;c=3;
printf("a=%d,b=%d",a,b,c);
return 0;
}
》