>不同的函数声明
请考虑以下代码片段:
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).
解决方法
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';