我有多个功能非常相似 - 它们接受相同的参数,并返回相同的类型:
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)
{
// ...
}
我通过搜索发现这个问题的解决方法是: 函数原型typedef可以用于函数定义吗?
然而,它没有提供太多的替代方案,只是重申了根据标准,我在其他实验中尝试的方法是被禁止的。它提供的唯一替代方案是使用
#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()
{
// ...
}
double mathFunction_1(const double *values, /* here */ const size_t array_length);
中WET第二个const
没有实际作用。与double mathFunction_1(const double *values, size_t array_length);
具有相同的效果。 - chux - Reinstate MonicaUIActionFunction my_cb;
。它说明了那个函数将是什么。它传达的不仅仅是一堆参数和返回类型。编译器将根据它(就像对于任何原型一样)检查定义。但是,如果您需要更改UIActionFunction
的含义,则代码中所有使用该类型别名声明的函数的位置在重新构建时都会立即被突出显示。它已经做了很多事情了。 - StoryTeller - Unslander Monica