我有多个彼此相似的函数 - 它们接受相同的参数,并返回相同的类型:
double mathFunction_1(const double *values, const size_t array_length);
我已经使用了指向这些函数的 typedef 指针,因为我将它们存储为一个数组,以便轻松地在相同数据上使用任意数量的它们,映射它们等:
typedef double (* MathFunction_ptr )(const double *, const size_t);
double proxy(MathFunction_ptr mathfun_ptr, const double *values, const size_t array_length);
我想要实现的是通过声明和定义函数实现类似的易用性,就像我已经使用指向它们的指针一样。
因此,我在考虑使用类似的 typedef 来使我更容易编写实际函数。我试过这样做:
// declaration
typedef double MathFunction (const double *values, const size_t array_length);
MathFunction mathFunction_2;
以下方法部分有效。它可以让我在声明中“省去几次击键”,但必须完全输入定义。
double mathFunction_2(const double *values, const size_t array_length)
{
// ...
}
我通过搜索更多关于这个问题的发现是这样的:Can a function prototype typedef be used in function definitions?
然而,它并没有提供很多替代方案,只是重申,根据标准,我在其他实验中尝试做的事情是被禁止的。它提供的唯一选择是使用
#define FUNCTION(name) double name(const double* values, size_t array_length)
这对我来说听起来很笨拙(因为我对使用预处理器持谨慎和怀疑态度)。
我尝试做的事情有哪些替代方案?
我尝试过的其他两种方法都不起作用(而且,正如我刚刚读到的那样,根据 C 标准 6.9.1,它们是被禁止的并且是绝对错误的):
1. 这种方法行不通,因为这意味着我告诉它定义一个变量 mathFunction_2(我相信该变量被视为一个指针,尽管我还不太了解这一点)就像功能:
MathFunction mathFunction_2
{
// ...
}
2.这种方法行不通,因为这意味着我要告诉它创建一个返回函数的函数(在 C 语言中是 Not Acceptable ):
MathFunction mathFunction_2()
{
// ...
}
最佳答案
您可以使用 typedef
作为签名(另请参阅 this ):
typedef double MathFunction_ty (const double *, const size_t);
然后声明几个具有相同签名的函数:
MathFunction_ty func1, func2;
或者使用它来声明一些函数指针:
MathFunction_ty* funptr;
however the definition has to be fully typed out.
当然,因为您需要在函数的 定义。因此
double func1(const double*p, const size_t s) {
return (double)s * p[0];
}
和
double func1(cont double*arr, const size_t ix) {
return arr[ix];
}
具有相同类型(由上面的 MathFunction_ty
表示的类型),即使它们的形式参数(或形式参数)的命名不同。
您可能会滥用预处理器并使用丑陋的宏来缩短此类函数的定义:
// ugly code:
#define DEFINE_MATH_FUNCTION(Fname,Arg1,Arg2) \
double Fname (const double Arg1, const size_t Arg2)
DEFINE_MATH_FUNCTION(func1,p,s) { return (double)s * p[0]; }
我发现这样的代码令人困惑且难以阅读。我不推荐这样的编码,即使它确实是可能的。但有时我会编写类似的代码(出于其他原因)。
(顺便说一句,想象一下,如果 C 要求将每个第一个形式参数命名为 $1
,将每个第二个形式参数命名为 $2
等...;恕我直言,这会使编程语言的可读性大大降低;因此形式参数的名称对人类读者很重要,即使系统名称会使编译器的工作更简单)
另请阅读 λ-calculus , anonymous functions (C 没有它们,但 C++ 有 lambda expressions ),closures (它们不是 C 函数,因为它们有闭合值,所以将代码与数据混合;C++ 有 std::function
-s),callbacks (“模仿”闭包的必要约定)...阅读SICP ,它将提高您对 C 或 C++ 的思考。另请查看 that回答。
关于c - 是否有可能 "typedef"(某种)函数原型(prototype)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48794475/