【发布时间】:2018-07-25 10:57:10
【问题描述】:
我有多个彼此相似的函数——它们接受相同的参数,并返回相同的类型:
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 语言中是不可接受的):
MathFunction mathFunction_2()
{
// ...
}
【问题讨论】:
-
它只是不能在定义中使用。但至少你让编译器在转换为指针之前检查你的函数是否匹配预期的原型。这很整洁,不是吗?
-
宏解决方案是要走的路。如果你害怕预处理器,你要么被 C++ 毒害,要么需要焦虑治疗 :-)
-
@Jens 不互斥。
-
因为 OP 对“节省一些击键”感兴趣。请注意,
double mathFunction_1(const double *values, /* here */ const size_t array_length);中的 WET 2ndconst没有任何功能用途。效果与double mathFunction_1(const double *values, size_t array_length); -
@tehftw - 我的意思是它既表达了意图/用法,又允许编译器检查它的正确性。想象一个更好的类型名称。想象一下,您正在声明一个
UIActionFunction my_cb;。它说明了该功能将是什么。它传达的不仅仅是一堆参数和一个返回类型。编译器将对照它检查定义(就像任何原型一样)。但是,如果您需要更改UIActionFunction是什么,那么代码中的所有位置将在重建时立即突出显示,对于由该类型别名声明的任何函数。它已经做了很多。
标签: c typedef function-prototypes