Частичное переопределение макросов - PullRequest
0 голосов
/ 12 июля 2019

Я пытаюсь перенести драйвер на новое приложение. Я ищу эффективный способ связать определения.

Пример:

someCommonHeader.h

#define abc_1234 0x01 
#define abc_5678 0x02 
#define abc_9012 0x03 

oldApplication.c

U8 x1,x2,x3; 

x1 = abc_1234 ; 
x2 = abc_5678 ;
x3 = abc_9012 ;

В новом приложении «abc_» заменено на «xyz_»

newApplication.c

x1 = xyx_1234; 
x2 = xyz_5678; 
x3 = xyz_9012; 

Конечно, я могу сделать что-то вроде:

compatibilityHeader.h

#define xyx_1234 abc_1234  
#define xyz_5678 abc_5678 
#define xyz_9012 abc_9012

Однако я смотрю, есть ли другой способ. Более конкретно, я хочу, чтобы компилятор заменил ссылки «xyz_» на «abc_». Это возможно?

Детали:

HW: встроенная система / микроконтроллер Компилятор: GCC Язык программирования: C

Любые предложения / ссылки приветствуются.

Ответы [ 3 ]

3 голосов
/ 12 июля 2019

В частности, я хочу, чтобы компилятор заменил ссылки "xyz_" на "abc_".Возможно ли это?

Нет.

Мы можем несколько упростить, заметив, что вам это понадобится в препроцессоре, поскольку вы хотите манипулировать именами макросов, которые разрешаются во времяПредварительная обработка.С учетом того, что область действия, таким образом, уменьшена, разумно просто прочитать раздел 6.10 стандарта, чтобы подтвердить, что, хотя существуют механизмы для объединения нескольких токенов в один, нет никаких механизмов для разделения токенов на части или работы с частями токенов.

В зависимости от количества появлений этих токенов и наличия других идентификаторов может быть целесообразным просто выполнить текстовый поиск и замену с последующей проверкой.Также может быть возможно извлечь старые определения макросов с помощью обработки текста или другого инструмента и программно сгенерировать определения макросов совместимости из них (кредит: @ Jean-FrançoisFabre).

0 голосов
/ 12 июля 2019

Предполагая, что я правильно понимаю, что вы ищете, вы можете использовать препроцессор для замены части строки.Таким образом, вы можете сделать что-то вроде этого, но это довольно уродливо:

#define OLD_APPLICATION       // Define if you need the old application

#ifdef OLD_APPLICATION        
  #define ABC_OR_XYZ    abc
#else
  #define ABC_OR_XYZ    xyz
#endif

Теперь везде в вашем коде замените все ваши метки их эквивалентами, такими как:

xyx_1234    ->    ABC_OR_XYZ##_1234
xyz_5678    ->    ABC_OR_XYZ##_5678
xyz_9012    ->    ABC_OR_XYZ##_9012
abc_1234    ->    ABC_OR_XYZ##_1234
abc_5678    ->    ABC_OR_XYZ##_5678
abc_9012    ->    ABC_OR_XYZ##_9012

Препроцессор обработает замену строки.
Обратите внимание, что ## используется для объединения строк.

Другой способ - написать собственный анализатор перед сборкой.

0 голосов
/ 12 июля 2019

вам нужно #undef ваш старый макрос, прежде чем вы сделаете новое определение

#undef abc_xyz
#define abc_xyz xyz_xyz

(заполните точки)

...