Почему _PROTOTYPE используется заголовочные файлы - PullRequest
1 голос
/ 09 апреля 2010

Почему мы используем _PROTOTYPE, например _PROTOTYPE (void * memset, (void * _s, int _c, size_t _n) Я видел это в MINIX3 исходный код

Ответы [ 3 ]

5 голосов
/ 09 апреля 2010

Потому что, как говорит блок заголовка, они не знали, будет ли использоваться компилятор ANSI или K & R, и этот marco позволяет им сохранять параметры в сборке ANSI и выбрасывать их в сборку K & R.

00033   /* Keep everything for ANSI prototypes. */
00034   #define _PROTOTYPE(function, params)    function params

стих

00045   /* Throw away the parameters for K&R prototypes. */
00046   #define _PROTOTYPE(function, params)    function()

, что означает

00483   _PROTOTYPE( void _exit, (int _status)    );

становится под ANSI:

void _exit(int _status);

и под K & R:

void _exit();
3 голосов
/ 09 апреля 2010

Исходный код, на который вы ссылаетесь, объясняет это:

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. Это редко, что вам нужно поддерживать оба.

1 голос
/ 09 апреля 2010

Для размещения стилей объявления функций как K & R, так и ANSI C. Взгляните на статью в Википедии о эволюции C .

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