c - 是否有可能 "typedef"(某种)函数原型(prototype)?

标签 c typedef function-prototypes

我有多个彼此相似的函数 - 它们接受相同的参数,并返回相同的类型:

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;

等等...所有这些都在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 - 是否有可能 "typedef"(某种)函数原型(prototype)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48794475/

相关文章:

c - 按字母顺序对 C 原型(prototype)进行排序的 Unixy 方式

c - 使用 fscanf 读取空格

c++ - 内置类型(int,char等)的析构函数

c - 最新的container_of宏中__mptr的用途是什么?

带有 typedef 的结构中的 C 枚举定义

c - 我可以用枚举变量做什么?

c - 函数原型(prototype)的优点

c - (struct *) vs (void *) -- C11/C99 中的函数原型(prototype)等价

c - 使用#undef 预处理器指令

c - 如何重定向stdout并在同一行打印 '\r'?