Исходный код, на который вы ссылаетесь, объясняет это:
00009 * Если _ANSI заканчивается определением, макрос
00010 *
00011 * _ПРОТОТИП (функция, параметры)
00012 *
00013 * определяется. Этот макрос расширяется по-разному, генерируя либо
00014 * Стандарты ANSI Standard C или K & R старого образца (Керниган и Ричи)
00015 * прототипы, по мере необходимости. Наконец, некоторые программы используют _CONST, _VOIDSTAR и т. Д.
00016 * таким образом, что они переносимы как для ANSI, так и для компиляторов K & R.
00017 * Соответствующие макросы определены здесь.
Прототипы K & R в старом стиле сначала имеют аргумент names , затем типы:
int foobar (x, y)
int x;
float *y;
{
/* code */
}
Стандартные прототипы ANSI объединяют их оба в начале:
int foobar (int x, float *y) {
/* code */
}
Макрос _PROTOTYPE
создает соответствующую сигнатуру любого типа в зависимости от того, определен ли _ANSI
. В этом конкретном случае сигнатуры K & R используются для реализации функций, но объявления функций либо включают, либо пропускают свои аргументы в зависимости от того, определено _ANSI
.
Стоит отметить, что объявления в стиле K & R датируются 1978 годом, и большая часть кода C, доступного в настоящее время, будет использовать современные подписи в стиле ANSI. Это редко, что вам нужно поддерживать оба.