c语言多文件中全局变量相同编程,c – 两个文件中相同函数/全局变量的不同声明...

本文探讨了在C语言中,函数声明与定义不一致以及全局变量不同声明的情况。在示例中,尽管函数原型与定义的参数类型不符,但程序仍能正确运行并打印预期值,这可能是因为类型转换隐含发生。对于全局变量,尽管在不同文件中有不同的声明,但输出结果相同,符合C语言的未指定行为。C11标准指出,多个外部定义可能导致未定义行为,但此处仅有一个定义,因此情况有所不同。

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

在C和C的情况下,我有两个关于同一函数和全局变量的声明的两个问题.

>不同的函数声明

请考虑以下代码片段:

file_1.c

void foo(int a);

int main(void)

{

foo('A');

}

file_2.c

#include

void foo(char a)

{

printf("%c",a); //prints 'A' (gcc)

}

正如我们所看到的,原型与定义中的定义不同

但是,file_2.c,该函数打印期望值.

如果是C语言,由于未定义,上述程序无效

在链接时引用foo(int).这可能是由于

存在其他功能签名 – 与C相比,其中

函数名称不包含任何指示的字符

函数参数的类型.

但是当涉及到C然后是什么?由于原型与之相同

无论参数的数量如何,name都具有相同的签名

及其类型,链接器不会发出错误.但是哪种类型

转换是在这里进行的?它看起来像这样:’A’ – >

int – >回到char?或许这种行为是

undefined / implementation-defined?

>全局变量的不同声明

我们有两个文件和两个不同的相同声明

全局变量:

file_1.c

#include

extern int a;

int main(void)

{

printf("%d",a); //prints 65 (g++ and gcc)

}

file_2.c

char a = 'A';

在C和C中,输出都是65.

虽然我想知道两种标准对这种情况的评价

情况.

在C11标准中,我发现了以下片段:

J.5.11 Multiple external definitions (Annex J.5 Common extensions)

There may be more than one external definition for the identifier of

an object,with or without the explicit use of the keyword extern; if

the definitions disagree,or more than one is initialized,the

behavior is undefined (6.9.2).

请注意,它指的是两个或更多定义的存在

我的代码只有一个,所以我不确定这篇文章是否是一个很好的参考点

这个案例…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值