两次声明 n 元函数的目的是什么,以便第二个参数的顺序与第一个相反?

What is the purpose of declaring an n-ary function twice, such that the order of the arguments of the second is the reverse of the first?

我正在阅读一个包含特定实时操作系统 (RTOS) 的 API 函数原型的 C 头文件,并注意到大多数函数都是按以下方式声明的:

#define foo(arg_1, arg_2, ... arg_n)        foo(arg_n, ... arg_2, arg_1)

也就是说,具有 2 个或更多参数的函数按如下所示成对声明,其中第二个函数的参数顺序与第一个函数的参数顺序相反。

请问这样做的目的是什么?


编辑:

我深入研究了代码,发现这个头文件和其他一些头文件包含支持不同 C/C++ 编译器的宏。特别是,如果使用 Microsoft C/C++ 编译器,调用约定 _pascal 将被调用。在这种情况下,API 函数是成对声明的,如上面问题描述中所述。

尽管缺乏上下文,但我相信 JeremyP and Frankie_C 都因正确猜测目的而值得称赞。关键字 "calling convention" 对我有很大帮助,对我理解那段代码至关重要。

它似乎是一个 header 精心制作的接口,用于连接为 PASCAL 调用约定编写的 object 库,其中推入堆栈的参数是相反的。

C 历史 ABI 约定中,参数按从右到左的顺序压入堆栈。

在不支持可变参数函数的 Pascal 中,参数从左到右推入。

定义颠倒了固定 ABI 的顺序。

https://azrael.digipen.edu/~mmead/www/Courses/CS225/HistoryOfCallingConventions.html