c – 两个文件中相同函数/全局变量的不同声明

前端之家收集整理的这篇文章主要介绍了c – 两个文件中相同函数/全局变量的不同声明前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在C和C的情况下,我有两个关于同一函数全局变量的声明的两个问题.

>不同的函数声明

请考虑以下代码片段:

file_1.c

void foo(int a);

int main(void)
{
    foo('A');
}

file_2.c

#include <stdio.h>

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 <stdio.h>

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).

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

解决方法

Q1.根据C99规范,第6.5.2.2.9节,它是C中未定义的行为:

If the function is defined with a type that is not compatible with the type (of the expression) pointed to by the expression that denotes the called function,the behavior is undefined.

表达式“指向”采用int的函数,而函数被定义为采用char.

Q2.变量的情况也是未定义的行为,因为您正在读取或从char分配int.假设4字节整数,这将访问超过其有效的内存位置的三个字节.您可以通过声明更多变量来测试这一点,如下所示:

char a = 'A';
char b = 'B';
char c = 'C';
char d = 'D';

猜你在找的C&C++相关文章