Я работаю над переносом некоторого старого кода K&R на ANSI C, поэтому я пишу объявления прототипов недостающих функций. Многие определения функций имеют параметры с классом хранения регистров, но я не уверен, можно ли пропустить спецификатор класса хранения регистров в прототипе функции?
С объявлением класса хранилища регистров и без него код компилируется правильно (я пробовал GCC, VC ++ и Watcom C). Я не смог найти никакой информации в стандарте ISO / ANSI C89 о том, что делать правильно - нормально ли, если я просто добавлю ключевое слово register в определение функции?
int add(register int x, register int y);
int add(register int x, register int y)
{
return x+y;
}
Это также правильно строит:
int add(int x, int y);
int add(register int x, register int y)
{
return x+y;
}
Я хочу убедиться, что спецификатор хранилища регистров действительно учитывается в соответствии со стандартом (моя цель - скомпилировать с использованием очень старого компилятора, где важен этот спецификатор класса хранилища). Оба в порядке, и это просто вопрос стиля кодирования, или нет?
register
исключения в стандарте? - person Eugene Sh.   schedule 13.02.2019auto int x;
,static int x;
иregister int x;
имеют типint
. - person PSkocik   schedule 13.02.2019auto
нельзя включить, аregister
можно (ну,static
не имеет смысла)? - person Eugene Sh.   schedule 13.02.2019auto
, поэтому никто не заметил, что это также может быть безвредно разрешено в объявлении параметра. - person PSkocik   schedule 13.02.2019auto
вообще предшествует спецификаторам типа (это было в B) и был добавлен, чтобы пометить оператор как объявление переменной; переменные, указанные в списке параметров, не нуждаются в этом, поэтому нет никакой двусмысленности, и ни один компилятор не подумал бы реализовать это. Тот факт, что позже он указывал класс хранилища, вероятно, является своего рода историческим артефактом, чтобы объяснить, почему нам нужен оператор пометки объявления сейчас, когда у нас есть имена типов в языке. - person Leushenko   schedule 14.02.2019