【问题标题】:Adding extra tag for C types为 C 类型添加额外的标签
【发布时间】:2011-11-29 15:30:03
【问题描述】:

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

REL char *p;

这仍然是一个指向char 的指针,编译器必须这样处理,但现在REL 标签将定义p 也是一个RELiable 指针。

HP int a;

相同,但现在HP 标记将这个int 定义为高性能int

我必须更改/修改预处理器?如何?

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

【问题讨论】:

  • 您可以使用#define 添加预处理器定义
  • #define REL 只会删除 REL 进行编译。
  • 您能指定如何翻译您的标签吗?例如。编译器应该看到什么而不是REL char* p;
  • 是的,编译器会看到所有 REL/HP 变量都将使用附加到预处理器的可靠/高性能硬件例程进行处理(我没有这个例程,因为它们受版权保护)。例如,所有 REL 变量都将从地址 0x00002000(内存的可靠分区)开始存储 例如,所有 HP 变量将从地址 0x00005000(内存的高性能分区)开始存储
  • 我不明白您所说的“附加到预处理器的特殊硬件例程”是什么意思。

标签: c gcc c-preprocessor


【解决方案1】:

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

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

char *p REL;
int a HP;

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

【讨论】:

  • 感谢您的帮助,它很有用!但是现在我有一个新问题,我怎样才能将 属性 用于局部变量?
【解决方案2】:

处理这种情况的标准方法是#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__))

【讨论】:

    猜你喜欢
    • 2016-12-19
    • 1970-01-01
    • 2023-02-13
    • 2011-06-15
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多