【问题标题】:Purpose of function declaration within function definition函数定义中函数声明的目的
【发布时间】:2021-05-04 18:59:33
【问题描述】:

在 C 中,当然可以声明和定义函数。这会与来自 C++ 的默认构造函数调用交互,从而产生最令人头疼的解析问题。假设我想声明一个函数foo,定义一个函数bar并创建一个实例t,我可能会错误地写这个(考虑到Python或Java):

T foo();

T bar() {
    T t();
}

这不会做我想要的,它将声明一个没有参数的函数t(或者可能是任意多个,因为那里没有写void,不确定)并返回类型T。我会得到一个带有T t;T 实例。

为什么甚至允许这种语法?仅在函数内声明函数有什么意义?无论如何,链接器必须在链接时解决这个问题,然后可以在文件范围内声明该函数。是否有一些我遗漏的边缘案例?

【问题讨论】:

  • 可能只是因为在函数范围内的这个函数声明在 C 中是允许的(没有最令人头疼的解析歧义)并且 C++ 想要接受大部分 C 语法?
  • @prog-fh:我明白了!所以我的问题应该是首先在 C 中是否允许这样做。

标签: c most-vexing-parse


【解决方案1】:

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

假设您有一个提供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 函数,我们将不得不在头文件的全局范围内声明它,这样就可以在没有任何警告的情况下访问它。

【讨论】:

    猜你喜欢
    • 2020-10-07
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多