函数定义中函数声明的目的
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 函数,我们将不得不在头文件中在全局范围内声明它,这样就可以了可在没有任何警告的情况下访问。
在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 函数,我们将不得不在头文件中在全局范围内声明它,这样就可以了可在没有任何警告的情况下访问。