这是我的问题:我使用的是非标准的ANSI C (使用标准GCC编译的ARM的修改后的r-tems),我想在前面添加一个额外的标签C 类型,它们维护type属性并添加一些“东西”。最终结果将是这样的:
REL char *p;
这仍然是指向char
的指针,编译器必须这样对待,但现在RE
L标记将定义p
也是可靠指针。
HP int a;
相同但现在HP
代码会将此int
定义为高性能int
。
我必须更改/修改预处理器吗?怎么样?
PS:这不是很重要但是根据我的项目的具体情况,我不能使用简单的#define
,因为REL
和HP
标记会附加到特殊的硬件例程直接绑定到预处理器。 (这是前面提到的“东西”)。
答案 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__))