函数定义中函数声明的目的

Purpose of function declaration within function definition

在C语言中,当然可以声明和定义函数。这与来自 C++ 的默认构造函数调用相互作用,产生 最令人烦恼的解析 问题。假设我要声明一个函数 foo,定义一个函数 bar 并创建一个实例 t,我可能会错误地写这个(在 Python 或 Java心灵):

T foo();

T bar() {
    T t();
}

这不会做我想要的,它会声明一个没有参数的函数 t(或者可能是任意多个参数,因为里面没有写 void,不确定)和 return 输入 T。我会得到一个 T 实例 T t;.

为什么允许使用这种语法?仅在函数内声明函数有什么意义? linker 无论如何都必须在 link 时解决这个问题,然后就可以在文件范围内声明该函数。有没有我遗漏的极端情况?

不是正式的解释,只是我将使用函数作用域声明的用例。

假设您有一个提供 inline static 函数的 C 头文件, 但在特定情况下,此函数应依赖 internal 辅助函数,该函数不属于 API.

// file utils.h
#ifndef UTILS_H
#define UTILS_H

// many other things...

inline static
int
nice_util(int i,
          int j)
{
  int k=i+2*j;
  if(i>10) // should not happen so often
  {
    void ugly_helper_function(int n); // no one else should be aware of this function
    ugly_helper_function(k);
  }
  return k;
}

#endif // UTILS_H

这个头文件可能有一个实现文件。

// file utils.c

#include <utils.h>
#include <stdio.h>

// many other things...

void
ugly_helper_function(int n)
{
  printf("%s(%d)\n", __func__, n);
}

使用这个头文件提供了预期的功能,而不是 内部 的功能(除非您忽略警告)。

// file prog.c
#include <utils.h>

int
main(void)
{
  // ugly_helper_function(5678); // warning: implicit declaration...
  return nice_util(12, 34);
}

如果无法在函数范围内声明 internal 函数,我们将不得不在头文件中在全局范围内声明它,这样就可以了可在没有任何警告的情况下访问。