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

C 函数定义中函数声明的目的,c,most-vexing-parse,C,Most Vexing Parse,在C语言中,当然可以声明和定义函数。这与C++中的默认构造函数调用交互,从而产生最麻烦的解析问题。假设我想要声明一个函数foo,定义一个函数bar,并创建一个实例t,我可能会错误地编写这个(考虑到Python或Java): tfoo(); T bar(){ T(); } 这并不是我想要的,它将声明一个没有参数的函数t(或者可能是任意多个参数,因为其中没有写入void,不确定),并返回类型t。我将得到一个T实例,其中T 为什么这种语法是允许的?在函数中声明函数有什么意义?无论如何,链接器都必须在

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

tfoo();
T bar(){
T();
}
这并不是我想要的,它将声明一个没有参数的函数
t
(或者可能是任意多个参数,因为其中没有写入
void
,不确定),并返回类型
t
。我将得到一个
T
实例,其中
T


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

不是一个正式的解释,而是一个我将使用函数范围声明的用例

假设您有一个C头文件,提供了一个
内联静态
函数, 但在特定情况下,此函数应依赖于内部助手函数,该函数不属于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);
}
//文件utils.c
#包括
#包括
//还有很多其他的事情。。。
无效的
丑陋的辅助函数(int n)
{
printf(“%s(%d)\n”,函数n);
}
使用此头文件可以提供预期的功能,但不能提供内部功能(除非忽略警告)

//文件prog.c
#包括
int
主(空)
{
//丑陋的辅助函数(5678);//警告:隐式声明。。。
返回nice_util(12,34);
}

如果没有在函数范围内声明内部函数的能力,我们就必须在头文件中的全局范围内声明它,这样就可以在没有任何警告的情况下访问它。

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

假设您有一个C头文件,提供了一个
内联静态
函数, 但在特定情况下,此函数应依赖于内部助手函数,该函数不属于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);
}
//文件utils.c
#包括
#包括
//还有很多其他的事情。。。
无效的
丑陋的辅助函数(int n)
{
printf(“%s(%d)\n”,函数n);
}
使用此头文件可以提供预期的功能,但不能提供内部功能(除非忽略警告)

//文件prog.c
#包括
int
主(空)
{
//丑陋的辅助函数(5678);//警告:隐式声明。。。
返回nice_util(12,34);
}

如果不能在函数范围内声明内部函数,我们就必须在头文件中的全局范围内声明它,这样就可以在没有任何警告的情况下访问它。

可能只是因为在C中允许在函数范围内声明函数(没有最麻烦的解析歧义)C++想接受大部分的C语法吗?@ PROG FH:我明白了!因此,我的问题应该是首先在C中是否允许这样做。可能只是因为函数范围内的函数声明允许在C中(没有最复杂的解析歧义),C++愿意接受大多数C语法吗?@ PROG FH:我明白了!所以我的问题应该是,在C中是否允许这样做。