LINUX.ORG.RU

Ifdef не понимает значение из enum

 


0

1

Добрый день. Столкнулся со следующей проблемой:

Есть:

enum { Value1, Value2, ValueCnt }

Он находится в общем заголовочном файле проекта. Код надо настроить таким образом чтобы если значение Value2 не определено то нужно исключить при сборке несколько include и определенный кусок кода.

При этом код: #ifdef Value2 // Тут какой то код #endif

Или

#if Value2 // Тут какой то код #endif

Не видит константы , хотя она объявлена в enum… Как это реализовать и почему с константами из enum данный код не работает?

Ifdef не понимает значение из enum

И не должен.

enum - это фича языка Си, а препроцессор работает до того, как транслятор си что-то распарсит.

Препроцессор просто обрабатывает текст, не понимая его смысла.

Вместо enum вам нужен #define.

wandrien ★★
()
Ответ на: комментарий от wandrien

Проблема следующая: нужно без правки исходника исключить сборку фрагмента кода. Если этого не сделать то include вернёт ошибку - т.к. включаемого файла не существует. А понять это можно по константе описанной в enum. Вообще как то можно это реализовать на этапе компиляции не плодя дополнительный define?

rusproger
() автор топика
Ответ на: комментарий от rusproger

Добавить в билд-среду предварительный шаг со сборкой тестового файла, в котором берётся эта константа.

Если файл собрался, то делаем #define BLA_BLA_PRESENT. Если не собрался, то не делаем.

И затем компилируем основной код, в котором:

#ifdef BLA_BLA_PRESENT
/* что-то тут делаем */
#endif

Если этого не сделать то include вернёт ошибку - т.к. включаемого файла не существует. А понять это можно по константе описанной в enum.

Это кривой дизайн изначального набора хидеров. Им нужен был не enum, а #define. Теперь только делать костыль с предварительным этапом сборки. Ну или заставлять сборщика вручную каждый раз проверять. Самой сишкой это не решается без внешнего инструмента.

wandrien ★★
()
Ответ на: комментарий от rusproger

Вообще как то можно это реализовать на этапе компиляции не плодя дополнительный define?

Средствами компилятора никак. Потому что #define/#ifdef/#include - это препроцессирование и оно выполняется ДО этапа компиляции. Препроцессор понятия не имеет про enum-ы и как они обрабатываются, он видит #include - включает его.

Только проверять наличие нужного header-а системой сборки.

SkyMaverick ★★★★★
()
Ответ на: комментарий от rusproger

понять это можно по константе описанной в enum

Если она не под твоим контролем, то никак (кроме парсинга руками перед сборкой). Если под твоим, то по традиции:

// header.h
enum {
  ...
#ifdef USE_FOOBARS
  foo,
  bar,
#endif
};

// source.c
...
#ifdef USE_FOOBARS
...
#endif

// build.sh
gcc -DUSE_FOOBARS ...
anonymous
()
Ответ на: комментарий от anonymous

Лол, Владимир мне будет рассказывать, как работают системы сборки. Иди дальше разрабатывай, что ты там себе разрабатываешь.

Binkledum
()
Ответ на: комментарий от wandrien

Ну насчёт дизайна:

В enum перечислены имена очередей, имя должно быть уникально, а ресурсы в памяти желательно расположить плотно. По имени (по сути идентификатору) очереди возвращается указатель на структуру элемента очереди. Поэтому нужно проверять существование элемента enum, а структура элемента очереди описана в хедере который нужно инклудить…

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

rusproger
() автор топика

Запомни раз и на всегда препроцессор обрабатывает исходный код до компилятора. Значения enum`ов для препроцессора как и всё остальное кроме явных констант заданных через define и иные механизмы препроцессора, а не языка не существует в принципе.

anonymous
()
Ответ на: комментарий от rusproger

Ну тогда только с этапом автоматической проверки конфигурации перед сборкой, как и было в треде сказано.

wandrien ★★
()
Ответ на: комментарий от Binkledum

Лол

Вам годиков 10?

Владимир мне будет рассказывать, как работают системы сборки

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

Иди дальше разрабатывай, что ты там себе разрабатываешь.

Вам с подобными фантазиями на гей ру нужно …

Владимир 123

anonymous
()
Ответ на: комментарий от rusproger

В чём проблема использовать

#if defined(BLA)
   code1
#else
   code2
#endif

code1 compiled gcc -DBLA src.c

code2 compiled gcc src.c

Можно сравнивать BLA==1 для code1 BLA==2 для code2

anonymous
()
Ответ на: комментарий от Binkledum
Эх раз, еще раз
я Владимир три два раз ...

Владимир 321

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.