C 定义两个具有相同标识符的函数,一个静态,另一个外部
在C语言中,我在两个不同的翻译单元中定义了两个具有相同标识符的函数。第一个翻译单元中的第一个函数用C 定义两个具有相同标识符的函数,一个静态,另一个外部,c,gcc,linker,ld,C,Gcc,Linker,Ld,在C语言中,我在两个不同的翻译单元中定义了两个具有相同标识符的函数。第一个翻译单元中的第一个函数用静态存储类说明符定义,另一个函数用外部定义。我想,我会从链接器中得到一个错误,但我没有。我有点困惑。为什么我没有从ld中得到错误 在第一个翻译单元中: static void func(void){ return; } int main(void){ func(); return EXIT_SUCCESS; } extern int func(int x){ return x;
静态
存储类说明符定义,另一个函数用外部
定义。我想,我会从链接器中得到一个错误,但我没有。我有点困惑。为什么我没有从ld
中得到错误
在第一个翻译单元中:
static void func(void){
return;
}
int main(void){
func();
return EXIT_SUCCESS;
}
extern int func(int x){
return x;
}
在第二翻译单元:
static void func(void){
return;
}
int main(void){
func();
return EXIT_SUCCESS;
}
extern int func(int x){
return x;
}
请提供一份报告。但一般来说,静态范围变量将隐藏全局外部,并且不是错误。使用
static
定义的符号不能出现在其TU之外。它不会与同名的其他静态符号冲突,也不会与未使用static
@kaylum定义的函数冲突。我已经编辑了帖子,包括代码。谢谢你的回答,这很有道理。@JonathanLeffler我已经注意到了,我的问题是为什么会这样?我认为Kaylum make senseIt的回答是这样的,因为C标准说这是必需的行为。(对于我之前评论中的错误,我很抱歉:“似乎”应该被“看见”,而“不”应该是“也”。啊!我的借口是“遛狗时打手机”——这不是一个好借口,但是…)