Что делает фраза «ключевое слово» в заголовочном файле? - PullRequest
4 голосов
/ 31 марта 2020

Не делайте C ++, так что это может быть глупым вопросом. Я изучаю заголовочный файл .h, где предположительно определены идентификаторы параметров в соответствии с документацией. Я сталкивался со строками, где находятся параметры, и они выглядят следующим образом:

#define  SPCDLL_ERROR_KEYWORDS \
{ \
  keyword (NONE), \
  keyword (OPEN_FILE), \
  keyword (FILE_NVALID), \
  keyword (MEM_ALLOC), \
};

#define  PARAMETERS_KEYWORDS \
{ \
  keyword (LIMIT_LOW), \
  keyword (LIMIT_HIGH), \
  keyword (LEVEL), \
  keyword (HOLDOFF), \
};

#ifdef keyword
#undef keyword  /* prevents redefinition warning */
#endif

#define keyword(key) key

Однако я искал и не могу точно узнать, что делает строка ключевого слова (ключа)? Это присваивает каждый параметр и ID на основе его порядка в списке? Будет ли это LIMIT_LOW, ID = 1? Почему это не определено явно? Кроме того, как есть два списка определений ключевых слов, как это работает?

Я приехал из Python страны, где я бы определил их как два словаря с идентификаторами и значениями для обоих Error_names и Parameter_vals.

Если кто-то может объяснить это, я был бы признателен.

Ответы [ 2 ]

4 голосов
/ 31 марта 2020

#define означает, что вы делаете макрос. keyword(key) означает, что вы создаете функцию в этом макросе, которая принимает параметр key. Последний key означает, что вы принимаете этот ключевой параметр, а затем что-то делаете с ним. Это может быть что угодно, вы можете std::cout это или действительно что-нибудь еще.

Когда вы вызываете этот макрос, вы передаете макрос keyword и вставляете что-нибудь для ключа.

Вы используете X макросов в верхней части файла, и у вас есть макрос keyword в этих функциях.

0 голосов
/ 31 марта 2020

Обратите внимание, что строки

keyword (SOME_CONSTANT), \

являются частью макроса. То есть они будут появляться везде, где развернуты макросы SPCDLL_ERROR_KEYWORDS и PARAMETERS_KEYWORDS.

И где бы это расширение ни происходило, оно будет использовать определение keyword() в последней строке вашего фрагмента кода. Таким образом, выражение PARAMETERS_KEYWORDS фактически расширится до

{
    LIMIT_LOW,
    LIMIT_HIGH,
    LEVEL,
    HOLDOFF,
};

Однако, это зависит от того, как keyword() фактически определено в точке использования, оно может быть определено для расширения до чего-либо, что C Препроцессор способен производить. Например,

#define keyword(foo) 1
char foo[] = SPCDLL_ERROR_KEYWORDS;
printf("There are %d SPCDLL_ERROR keywords\n", sizeof(foo));

приведет к фактическому количеству keyword() вызовов в SPCDLL_ERROR_KEYWORDS.

. Я не имею понятия, в каком контексте эти макросы фактически используются / полезны, но такие конструкции как правило, служат определенной цели c: эффект keyword(FOO) в основном такой же, как FOO сам по себе, но отмечает использование FOO для других целей . Такое другое использование может быть в некоторых других макросах или других инструментах, которые используются для обработки исходного кода. Как и инструменты документации, линтеры, автоматические c сценарии генерации заголовков и т. Д. И т. Д.

Единственный способ выяснить это на самом деле - найти, где выражение \<keyword\> используется во всей базе кода , Скорее всего, это позволит вам наткнуться на комментарии, которые предоставляют подсказки, и / или некоторый скрипт, который фактически выполняет дополнительную обработку.

...