为什么有些人在一个函数中声明了extern函数?

Yua*_*Wen 1 c function extern

我需要维护一些其他人编写的代码.我只是遇到了在一个函数内声明并在别处定义的许多函数.例如:

int func(){
    ...
    extern func1();
    extern func2();
    ...

}
Run Code Online (Sandbox Code Playgroud)

他们为什么声明和定义这样的函数?为什么他们不在外面声明函数?有什么好处?

gna*_*729 6

这是一种非常危险的做法 - 无法保证原型与实际功能相匹配,如果不匹配,各种事情都可能出错.特别是实际实现这些函数的代码将不会看到此声明,这使它变得危险.

执行此操作的正确方法是两个函数的作者将其声明放入头文件中,使用它们的文件应包含该头文件.通常,每个C函数都应该是静态的,或者应该在头文件中声明.

如果代码是这样编写的,那么它是出于懒惰,并且可能出于为未来的开发人员设置陷阱的愿望.您还可以看到声明使用过时的样式:extern func1()表示func1返回一个int(作为默认值),并且它需要一个未知但固定数量的参数.所以你(和编译器)甚至不知道如何调用它.

假设该函数实现为

int func1 (int arg)
Run Code Online (Sandbox Code Playgroud)

并且实施者决定将其更改为

void func1 (int arg, int* result)
Run Code Online (Sandbox Code Playgroud)

通过指针返回值,而不是函数结果.奇怪的声明将确保编译器没有机会检测到这一点,并且在更改之后调用func1很可能会崩溃,或者更糟糕的是在应用程序的某处覆盖随机int.这是一场等待发生的灾难.如果您在应用程序中看到这样的代码,请立即修复它.