Ключевое слово register
является в основном устаревшей функцией в современном C. Оно делает две вещи:
- Скажите компилятору, что он должен попытаться сохранить переменную в регистре CPU, если это возможно.Компилятор в настоящее время гораздо больше подходит для таких вызовов, чем программист, поэтому устаревшая функция.
- Блокирует программисту получение адреса переменной.
В вашем случае этоговорит, что указатель сам , а не данные, на которые указывают, предпочтительно должен храниться в регистре, предположительно регистре адреса / индекса.Из стандартного представления C он не делает ничего, кроме этого.
Возможно, что некоторый экзотический компилятор выбирает определенное соглашение о вызовах, когда ему присваивается register
как часть функции, хотя я никогда не виделчто раньше.Практика для соглашения о вызовах - это нечто вроде: «если параметр n является указателем, сохраните его в индексном регистре x, если параметр n + 1 является указателем, сохраните его индексным регистром y» и т. П.
Я подозреваю, что наиболее вероятное объяснение ключевого слова register
в том, что программист не знал, что они делают.Тем более что в заголовке не было никаких комментариев по этому поводу - это довольно верный признак некомпетентности.Если рассматривать заголовок в целом, есть много других признаков, поддерживающих теорию некомпетентности, таких как эта вопиющая ошибка: #define XkbLC_BeepOnComposeFail (1<<31)
.Если вы сможете найти UB в течение нескольких минут после краткого обзора источника, держитесь подальше от него.