Стандарт C89 действительно говорит это (§ 3.5.4.3 Внешние определения):
Единственный спецификатор класса хранения, который должен встречаться в объявлении параметра, это register
.
Таким образом, может показаться, что register
допустимо в качестве спецификатора класса хранилища параметров функции, но я все еще считаю, что то, соблюдается ли это, действительно зависит от архитектуры и соглашения о вызовах для функции.
Поскольку вы упомянули Watcom и C89, я предполагаю, что вы ориентируетесь на x86-16.Все типичные соглашения о вызовах для x86-16 (pascal
, stdcall
и cdecl
) требуют, чтобы параметры помещались в стек, а не в регистры, поэтому я сомневаюсь, что ключевое слово фактически изменит способ передачи параметровк функции на сайте вызова.
Предположим, у вас есть следующее определение функции:
int __stdcall add2(register int x, register int y);
Функция переходит в объектный файл как _add2@4
согласно требованиям для stdcall.@ 4 указывает, сколько байтов нужно удалить из стека при возврате функции.В этом случае используется команда ret imm16
(возврат к вызывающей процедуре и извлечение байтов imm16 из стека).
add2
будет иметь следующий ret
в конце:
ret 4
Если 4 байта не были помещены в стек на месте вызова (т. Е. Потому что параметры фактически были в регистрах), ваша программа теперь имеет неправильно выровненный стек и вылетает.