c中全局同名变量、函数

本文探讨了C语言中全局同名变量和函数的问题。当头文件包含extern声明与实际定义的变量类型不匹配时,仍能通过编译,以定义时的类型为准。对于函数,参数可以随意编写而能编译通过,但可能导致参数未传递。只有当extern声明与定义匹配,并且正确包含头文件,函数调用才会得到预期结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同名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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值