同名1.h :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int globle_int_a;
void globle_Func() {
printf("同名1 :%d\n", globle_int_a);
};
void myfunc();
同名2.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include "同名1.h" ,如果include了,globle_int_a编译出错,类型不一致
double globle_int_a=123.345;
//void globle_Func(double val) {
// printf("同名2.c:%f\n", val);
//}
void main()
{
int a = 34;
globle_Func(globle_int_a,3);//输出
myfunc();//输出
}
同名3.c
#include "同名1.h"
void myfunc() {
printf("在同名3.c:");
globle_Func(4,5);
}
在同名2.c中 ://#include "同名1.h" ,如果include了,globle_int_a编译出错,类型不一致
1.不include时,extern 声明 与 实际定义 的变量类型不同没问题,一样可以通过编译,以定义时的类型为准
2.函数的参数随便写几个都可以通过编译
运行结果:
同名1 :2061584302 ------double globle_int_a=123.345;的高四位或者第四位
在同名3.c:同名1 :2061584302
------------------------------------------------
如果
同名1.h:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int globle_int_a;
extern void globle_Func();/* {
printf("同名1 :globle_int_a=%d\n", globle_int_a);
};*/
void myfunc();
同名2.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include "同名1.h" ,如果include了,globle_int_a编译出错,类型不一致
double globle_int_a=123.345;
void globle_Func(double val) {
printf("同名2.c:%f\n", val);
}
union test {
int a;
double b;
};
void main()
{
union test t;
t.b = 123.345;
printf("t.a=%d\n", t.a);
printf("同名2 :globle_int_a=%f\n", globle_int_a);
globle_Func(globle_int_a,3);//输出
myfunc();//输出
}
同名3.c不变:
#include "同名1.h"
void myfunc() {
printf("在同名3.c:");
globle_Func(4,5);
}
输出:
t.a=2061584302
同名2 :globle_int_a=123.345000
同名2.c:123.345000
在同名3.c:同名2.c:0.000000
同名3.c : 当extern 的声明,与 同名2.c中的定义不匹配时,include “同名1.h”没有用,不include结果一样,都是没有传参数到globle_Func函数中,都是输出0.00000
只有当
1.extern 的声明,与 同名2.c中的定义都匹配一致
并且
2. 同名3.c 文件 include “同名1.h”
才输出正确: 在同名3.c:同名2.c:123.345000