我写了这两个重载:
int func(int, int) {
return 1;
}
int func(double, double) {
return 2;
}
Run Code Online (Sandbox Code Playgroud)
当我使用明显的两个调用方案(即func(1, 1)and )调用它们时,分别调用func(1.0, 1.0)了第一个和第二个重载函数,并且当我尝试调用func(1, 1.0)它时会出现错误,但是当我将1a强制转换为 a 时long long,我不会得到一个错误,第二个重载就是被调用的那个。
#include <iostream>
int main()
{
std::cout << func(1, 1); // outputs 1.
std::cout << func(1.0, 1.0); // outputs 2.
// std::cout << func(1, 1.0); // erroneous.
std::cout << func((long long)1, 1.0); // outputs 2.
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?起初,我认为这是因为一些提升,但我尝试了带有两个浮点数的第三次重载,但我无法通过调用它来调用它像func((int)1, 1.0f). 我不知道为什么会不一样,也不知道为什么在long long传递a 时会调用第二个重载。
#include <stdio.h>
void func() {}
int main() {
printf("%p", &func);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序输出0x55c4cda9464a
假设func将存储在该.text部分中,并且根据此图,从CS:APP:
我认为 的地址func将在该.text部分的起始地址附近的某个位置,但该地址位于中间的某个位置。为什么会这样?存储在堆栈上的局部变量的地址接近 2^48 - 1,但我试图反汇编不同的 C 代码,指令总是位于该0x55...地址附近的某个地方。
// a.c
#include <stdio.h>
int main() {
printf("%d", sum());
}
Run Code Online (Sandbox Code Playgroud)
// b.c
int sum() {
return 10;
}
Run Code Online (Sandbox Code Playgroud)
我gcc a.c b.c正常编译这两个文件
,它可以正常工作并发出implicit declaration警告,如果我sum在a.c. 我在另一篇文章中读到,如果我不声明函数并且正确调用它,那很好,但不建议这样做,我应该始终声明我在每个文件中使用的内容,这很好,并且可以理解。
我不明白的是为什么在另一个文件中定义的函数和变量之间存在区别。为什么我不能以与上述相同的方式使用另一个文件中定义的变量?不过,我也可以通过i在我使用它的文件中声明来让它运行。
// c.c
#include <stdio.h>
int main() {
printf("%d", i);
return ;
}
Run Code Online (Sandbox Code Playgroud)
// d.c
int i = 12;
Run Code Online (Sandbox Code Playgroud)
编译gcc c.c d.c,产生以下错误
c.c: In function ‘main’:
c.c:3:19: error: ‘i’ undeclared (first use in this function)
printf("%d", i);
^
c.c:3:19: note: each undeclared identifier is …Run Code Online (Sandbox Code Playgroud)