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

C 两次声明一个n元函数的目的是什么,使得第二个的参数顺序与第一个相反?,c,arguments,header-files,declaration,C,Arguments,Header Files,Declaration,我正在阅读一个包含特定实时操作系统(RTOS)API函数原型的C头文件,注意到大多数函数都是以以下方式声明的: #define foo(arg_1, arg_2, ... arg_n) foo(arg_n, ... arg_2, arg_1) 也就是说,如图所示,具有2个或更多参数的函数成对声明,其中第二个函数的参数顺序与第一个函数的参数顺序相反 请问这样做的目的是什么 编辑: 我进一步研究了代码,发现这个头文件和一些其他头文件包含支持不同C/C++编译器的宏。特别是,如果使用

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

#define foo(arg_1, arg_2, ... arg_n)        foo(arg_n, ... arg_2, arg_1)
也就是说,如图所示,具有2个或更多参数的函数成对声明,其中第二个函数的参数顺序与第一个函数的参数顺序相反

请问这样做的目的是什么


编辑:

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


尽管缺乏背景,但我相信正确地猜测目的是值得称赞的。关键字“调用约定”对我有很大帮助,在我试图理解这段代码时起着关键作用。

它似乎是一个精心设计的头,用于接口为调用约定编写的对象库,其中推送到堆栈上的参数是反向的

C历史ABI惯例中,参数按从右到左的顺序推送到堆栈上

在不支持变量函数的Pascal中,参数被从左向右推

定义的顺序与修复ABI的顺序相反


没有任何上下文,甚至很难猜测。请花些时间阅读,以及。我猜这与调用约定有关-也许它们想使用标准参数顺序的相反形式。@PYK:你能给出一个你在标题中看到的适当示例吗?这可能有助于每个人联系并更好地理解这个问题。