Взаимоисключающие константы. Как сделать через макросы?

Тема в разделе "LANGS.C", создана пользователем Magnum, 3 дек 2011.

  1. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Привет
    Что я хочу:
    Есть две константы. При чем в одном проекте может быть объявлена только одна константа.
    К примеру:

    #define CONST_1 0x10
    #define CONST_2 0x20

    Нужно макросами сделать так, чтобы проект НЕ СОБИРАЛСЯ, если одновременно объявлены две константы или не объявлено ни одной. Чтобы компилятор ругался.
    Как сделать?
     
  2. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Вроде того наверное:
    Код (Text):
    1. #ifdef CONST_1
    2.     #ifdef CONST_2
    3.          #error blablabla
    4.      #endif
    5. #endif
    Кошмарный конечно вариант, но на ум больше ничего не приходит. Опять таки хидер с содержанием этой ахинеи должен быть подключен после определения констант. Сами константы объявлять так:
    Код (Text):
    1. #ifndef CONST_2
    2.    #define CONST_1
    3. #else
    4.    #error blablabla
    5. #endif
    6. #ifndef CONST_1
    7.    #define CONST_2
    8. #else
    9.    #error blablabla
    10. #endif
    Думаю, адекватного способа сделать это не существует.
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Код (Text):
    1. #if (defined(CONST_1) && defined(CONST_2)) || (!defined(CONST_1) && !defined(CONST_2))
    2.     #error Error
    3. #endif
     
  4. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    rmn, Sholar
    Спасибо! Работают оба варианта!