Какова цель объявления дважды n-арной функции так, чтобы порядок аргументов второго был обратным первому? - PullRequest
0 голосов
/ 13 февраля 2019

Я читал файл заголовка C, содержащий прототипы функций API для конкретной операционной системы реального времени (RTOS), и заметил, что большинство функций объявлено следующим образом:

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

То есть функции с 2 или более аргументами объявляются попарно, как показано, в котором порядок аргументов второй функции противоположен порядку первой функции.

Могу ли я знать, какова цельделать это?

Редактировать:

Я углубился в код и обнаружил, что этот заголовочный файл и некоторые другие заголовочные файлы содержат макросы для поддержки различных компиляторов C / C ++.В частности, соглашение о вызовах _pascal вызывается, если используется компилятор Microsoft C / C ++.В этом случае функции API объявляются попарно, как указано в описании проблемы выше.

Я полагаю, что оба JeremyP и Frankie_C заслуживают похвалы за правильное угадывание цели,несмотря на отсутствие контекста.Ключевое слово «соглашение о вызовах» очень помогает мне и играет ключевую роль в моей попытке понять этот сегмент кода.

1 Ответ

0 голосов
/ 13 февраля 2019

Кажется, что заголовок создан для интерфейса библиотеки объектов, написанной для PASCAL соглашения о вызовах, при котором параметры, помещаемые в стек, инвертируются.

В C исторические ABI соглашение о том, что параметры помещались в стек справа налево.

В Pascal, который не поддерживал функции с переменным числом аргументов, аргументы помещались слева направо.

Определить в обратном порядке порядок фиксации ABI .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...