Добавление дополнительного тега для типов C - PullRequest
1 голос
/ 29 ноября 2011

Это моя проблема: я использую стандарт NON ANSI C (модифицированный r-tem для ARM, который компилируется со стандартным GCC), и я хочу добавить дополнительный тег перед C типы, которые поддерживают свойство type и добавляют некоторые "вещи".Окончательный результат будет примерно таким:

REL char *p;

Это все еще указатель на char, и компилятор должен обрабатывать его так, но теперь тег RE L будет определять, что pУказатель RELiable тоже.

HP int a;

то же самое, но теперь тег HP определит это int как HighPerformance int.

Мне нужно изменить / изменить препроцессор?Как?

PS: это не очень важно, однако из-за специфики моего проекта я не могу использовать простой #define, потому что теги REL и HP будут привязаны к специальной аппаратной подпрограмме, привязанной непосредственно кпрепроцессор.(Это уже упоминавшийся "материал").

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Используйте атрибут __attribute__((section("SECTION"))), чтобы указать GCC поместить переменную в определенный раздел.Затем используйте скрипт компоновщика , чтобы убедиться, что соответствующие разделы сопоставлены с соответствующими местами в памяти.Например:

#define REL __attribute__((section("REL")))
#define HP __attribute__((section("HP")))

char *p REL;
int a HP;

Я не очень знаком со скриптами компоновщика, поэтому выяснить, как это сделать, - упражнение для читателя.

0 голосов
/ 30 ноября 2011

Стандартным способом решения таких ситуаций являются директивы #pragma. Некоторые компиляторы, такие как gcc, следуют своим собственным строкам синтаксиса, добавляя __attribute__.

Оба стали немного ближе с C99, в котором появился оператор _Pragma. По сути, оператор _Pragma позволяет вам размещать директивы #pragma внутри макросов, а также позволяет вам составлять содержимое директивы, как правило, с помощью раскрытия макроса.

Так что вы могли бы иметь что-то вроде

#define REL _PRAGMA(do something clever to reserve an special address for __LINE__)

или с gcc специальностями

#define REL __((whatever,__COUNT__))
...