Есть ли элегантное решение для проверки, определен ли символ препроцессора или нет? - PullRequest
0 голосов
/ 06 ноября 2018

Поскольку препроцессор не сообщает об ошибке при проверке значения символа препроцессора, который на самом деле не определен (обычно из-за отсутствия #include «some_header.h»), я использую эту громоздкую трехстрочную конструкцию с «определенным» :

#if !defined(SOME_SYMBOL)
#error "some symbol isn't defined"
#endif
#if SOME_SYMBOL == 1
// Here is my conditionally compiled code
#endif

И путь с "#ifndef" такой же.
Есть ли более элегантный способ выполнить эту проверку?

1 Ответ

0 голосов
/ 06 ноября 2018

В вашей конструкции вы можете использовать блок else, чтобы пропустить проверку для определенного:

#if SOME_SYMBOL == 1
// Here is my conditionally compiled code
#else
// error
#endif

Но в принципе комментарии верны. #if !defined и сокращение #ifndef являются двумя доступными версиями.

В настоящее время вы проверяете, равно ли SOME_SYMBOL 1. Вы выполняете другой код на основе этого значения? Если нет, вы можете просто использовать:

#ifdef SOME_SYMBOL
// Here is my conditionally compiled code
#else
// error
#endif

А теперь это короткий шаг к типичному c ++ , включающему охрану . Копирование с этой ссылки в Википедии, вот файл grandparent.h:

#ifndef GRANDPARENT_H
#define GRANDPARENT_H

struct foo {
    int member;
};

#endif /* GRANDPARENT_H */

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

...