Возможно ли несколько #define? - PullRequest
0 голосов
/ 11 декабря 2018

Я создал два приложения, оба работают нормально.Использование компилятора GCC.Цель: LPC40xx MCU.

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

Пример:

file1.h: #define DEF1 1
file2.h: #define DEF1 0x0001

file1.c include file1.h (DEF1 = 1)
file2.c include file2.h (DEF1 = 0x0001)

Даже если они технически имеют одинаковое значение, компоновщику это не нравится.

Что я хочу, это сказать компилятору / компоновщику игнорировать наличие множественного определения.file1.c включает file1.h с "#define DEF1 1" и должен игнорировать, что file2.h имеет другое определение DEF1, но просто перейдите к определению DEV1 в файле, который он включает.

file1.c

- include file1.h
- #define DEV1 1 

file2.c

- include file2.h
- #define DEV1 0x0001

То, что я ищу, - это способ заставить file1.c использовать #define в файле .h, который он включает, и игнорировать#define в других .h файлах.

это возможно каким-либо образом?

Ответы [ 4 ]

0 голосов
/ 11 декабря 2018

так что обычно это заголовки sdk, как правило, они просто не будут определяться, какой бы символ ни находился, прежде чем его определить:

пример из complex.h:

#undef complex
#define complex _Complex
#undef _Complex_I
/*  Constant expression of type const float _Complex                          */
#define _Complex_I (__extension__ 1.0iF)
#undef I
#define I _Complex_I

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

0 голосов
/ 11 декабря 2018

Предполагая, что file1 и file2 являются отдельными модулями, которые должны быть отделены друг от друга, стандартная практика в C состоит в том, чтобы добавить префикс имени #define к некоторому короткому пространству имен для логической единицы, например:

#define FILE1_DEF1 1

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

Если file1 и file2 оба являются субкомпонентами какого-либо всеобъемлющего модуля, то вам следует абстрагировать определение DEF1 в какой-то другой заголовочный файл.которые могут включать и file1.h, и file2.h.

0 голосов
/ 11 декабря 2018

У вас есть два варианта:

  1. Как указывал @tadman, вы можете просто #undef DEV1 между #include
  2. Редактировать источники

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

0 голосов
/ 11 декабря 2018

Вы можете передать опцию -DDEV1=0x0001 компилятору gcc при компиляции file2.c.

Тогда вы, вероятно, захотите кодировать в file1.h что-то вроде

#ifndef DEV1
#define DEV1 1
#endif

Подробнее о , вызывающем GCC .Прочтите также документацию cpp.

PS.Я не уверен, что понимаю, чего именно ты хочешь достичь.Тем не менее, я полагаю, что вы действительно хотите передать флаг -D в некоторых своих сборниках, и вам также может понадобиться #ifndef

...