Какая польза от определения ARGS в другом заголовочном файле? - PullRequest
0 голосов
/ 12 апреля 2011

Итак, я прошел через некоторый код, и есть некоторые вещи, которые я не могу понять.У меня есть два заголовочных файла.Один из них называется «args.h», и в нем есть следующие операторы:

#if (defined(__cplusplus) || defined(__STDC__) || defined(c_plusplus))
#define NEW_STYLE 1
#define VOID    void
#define ARGS(parenthesized_list) parenthesized_list
#else
#define NEW_STYLE 0
#define VOID
#define ARGS(parenthesized_list) ()
#define const
#endif

#if !defined(EXIT_SUCCESS)
#define EXIT_SUCCESS    0
#define EXIT_FAILURE    1
#endif

В другом заголовочном файле прототипы функций объявляются так:

#if defined(__cplusplus)
extern "C" {
#endif

extern void     yyerror ARGS((const char *s_));
extern int      yylex ARGS((void));
extern int      yyparse ARGS((void));
extern int      yywrap ARGS((void));

#if defined(__cplusplus)
}
#endif

и множество других вещей.

Итак, мои вопросы:

1> Что именно делает #define const?

2> Почему arg объявлен в другом заголовкефайл?Не могли бы мы просто объявить функции как обычный extern void a (const char * s__)?Или это просто предпочтение стиля?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 12 апреля 2011

Это позволяет компилировать код с предварительно стандартным компилятором Си.Он превращает прототип функции в объявление функции и просто полностью удаляет const.

Если вам нужно использовать такой древний компилятор, что он не понимает прототипы или const, у вас мало выбора, кромеиспользовать что-то вроде этого.В противном случае вам лучше всего избавиться от этих ужасных ошибок.

20 лет назад, подобный код был обычным и необходимым.Сегодня кажется, что это сложнее оправдать, но я полагаю, что еще может быть несколько платформ, для которых нет достаточно современного компилятора.

0 голосов
/ 12 апреля 2011

Это настройки, которые делают код переносимым среди компиляторов, в которых отсутствует та или иная функция.

  1. везде удаляет const (наверняка, не очень хорошая идея, если у вас современный компилятор)* это связано с синтаксисом ANSI C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...