为C类型添加额外标记

时间:2011-11-29 15:30:04

标签: c gcc c-preprocessor

这是我的问题:我使用的是非标准的ANSI C (使用标准GCC编译的ARM的修改后的r-tems),我想在前面添加一个额外的标签C 类型,它们维护type属性并添加一些“东西”。最终结果将是这样的:

REL char *p;

这仍然是指向char的指针,编译器必须这样对待,但现在RE L标​​记将定义p也是可靠指针。

HP int a;

相同但现在HP代码会将此int定义为高性能int

我必须更改/修改预处理器吗?怎么样?

PS:这不是很重要但是根据我的项目的具体情况,我不能使用简单的#define,因为RELHP标记会附加到特殊的硬件例程直接绑定到预处理器。 (这是前面提到的“东西”)。

2 个答案:

答案 0 :(得分:1)

使用__attribute__((section("SECTION")))属性告诉GCC将变量放在特定部分中。然后,使用linker script确保相应的部分映射到内存中的适当位置。例如:

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

char *p REL;
int a HP;

我对链接器脚本不是很熟悉,所以弄清楚如何做到这一点对于读者来说是一种练习。

答案 1 :(得分:0)

处理此类情况的标准方法是#pragma指令。一些编译器(如gcc)通过添加__attribute__来遵循自己的语法行。

自推出_Pragma运算符的C99以来,两者都接近了。基本上_Pragma运算符允许您在宏中放置#pragma指令,并且还允许您通过宏扩展来编写指令的内容。

所以你可以拥有像

这样的东西
#define REL _PRAGMA(do something clever to reserve an special address for __LINE__)

gcc专业

#define REL __((whatever,__COUNT__))