C语言没有extern,不同文件名为什么可以相互调用

小熊猫c++为什么没有声明extern,不同文件名还可以相互调用

img

extern是用来声明变量的,不是用来声明函数的
函数只要前面有声明就行了

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7800119
  • 你也可以参考下这篇文章:【C++】一个例子说明extern该如何使用
  • 除此之外, 这篇博客: C++程序中的extern“C”到底是干什么的中的 2. C++中的extern用法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在C++中,extern关键字除了有了C语言完全一样的用法外,还可以用来解决C和C++编译不相容的问题,从而实现C/C++混合编程。

    简单来说,就是使用extern "C"来修饰变量和函数,它是一种连接声明(linkage declaration),被它修饰的变量和函数是按照C语言的方式编译和连接的。

    为什么说按照C语言的方式呢?难道C和C++中对函数的编译方式不相同吗?我们不妨来看看C++中对类似C的函数是怎样编译的:作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。为了满足函数重载的需求,函数在被C++编译后在符号库中的名字与C语言的不同。

    例如,假设某个函数的原型为:void foo(int x, int y);

    那么该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo(int x, int y)void foo(int x, float y)编译生成的符号是不相同的,后者为_foo_int_float

    那么在扩展延申一下,同样地,C++中的变量除了支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以“.”来区分。而本质上,编译器在进行编译时,与函数的处理相似,也是为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。

  • 以下回答由chatgpt基于相关博客总结生成:

    C和C++之间在这个问题上的差异是,C语言中没有extern关键字,但仍然可以在不同文件之间相互调用。这是因为C语言中的函数和变量默认具有外部链接性,所以它们可以在不同的文件中共享。

    在C++中,变量有且仅有一个定义,为了让多个文件访问相同的变量,需要进行声明和定义的区分。声明用于向程序表明变量的类型和名字,而定义为变量分配存储空间并可以指定初始值。在C++中,可以使用extern关键字来声明变量名而不定义它,表示变量定义在程序的其他地方。在多文件中使用的变量需要有与定义分离的声明,一个文件含有变量的定义,其他文件则包含该变量的声明。

    对于C++调用C语言封装的方法,C++支持函数重载而C语言不支持,导致编译后函数名不同。为了保证兼容性,可以使用extern "C"来表示采用C语言的方式调用函数。

    所以,针对你提出的问题,C和C++之间在这方面的差异主要是C语言中没有extern关键字,但仍然可以相互调用,而C++中则需要进行声明和定义的区分,并且在调用C语言封装的方法时需要使用extern "C"来保证兼容性。