在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).
请注意,它指的是两个或更多定义的存在
我的代码只有一个,所以我不确定这篇文章是否是一个很好的参考点
这个案例…