是否可以“typedef”(各种)一个函数原型?

我有多个彼此相似的函数 – 它们接受相同的参数,并返回相同的类型:
double mathFunction_1(const double *values,const size_t array_length);

我已经使用了typedef’d指向那些函数的指针,因为我将它们存储为一个数组,以便在相同的数据上轻松使用它们,映射它们等:

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语言中不可接受):

MathFunction mathFunction_2()
{
    // ...
}

解决方法

您可以使用typedef进行签名(另请参阅 this):
typedef double MathFunction_ty (const double *,const size_t);

然后声明相同签名的几个函数

MathFunction_ty func1,func2;

或者使用它声明一些函数指针:

MathFunction_ty* funptr;

等等……所有这些都在C11,阅读n1570.

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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...