【发布时间】:2011-03-29 00:49:51
【问题描述】:
有时,在使用宏生成代码时,有必要创建具有全局范围但对于创建它们的直接上下文之外的任何内容都没有真正用处的标识符。例如,假设有必要在编译时将数组或其他索引资源分配到各种大小的块中。
/* 产生一些故事书人物的枚举,并分配一些 任意索引资源给他们。枚举和资源索引 将从零开始。 对于每个名称,将 HPID_xxxx 定义为该名称的枚举。 还将 HP_ID_COUNT 定义为名称的总数,并且 HP_TOTAL_SIZE 为总资源需求,并创建一个 数组 hp_starts[HP_ID_COUNT+1]。每个字符 n 被分配资源 从 hp_starts[n] 到(但不包括)hp_starts[n+1]。 */ /* 给出名称和它们各自的长度 */ #define HP_LIST \ HP_ITEM(弗雷德,4)\ HP_ITEM(乔治,6)\ HP_ITEM(哈利,5)\ HP_ITEM(RON, 3) \ HP_ITEM(赫敏,8)\ /* 吸收最后一个反斜杠需要空白行 */ #define HP_ITEM(name, length) HPID_##name, typedef enum { HP_LIST HP_ID_COUNT} HP_ID; #undef HP_ITEM #define HP_ITEM(name, length) ZZQ_##name};枚举 {ZZQX_##name=ZZQ_##name+(长度)-1, 枚举 { HP_LIST HP_TOTAL_SIZE}; #undef HP_ITEM #define HP_ITEM(name, length) ZZQ_##name, const unsigned char hp_starts[] = { HP_LIST HP_TOTAL_SIZE}; #undef HP_ITEM #include “stdio.h” 无效主要(无效) { 诠释我; printf("ID 计数=%d 总大小=%d\n",HP_ID_COUNT,HP_TOTAL_SIZE); for (i=0; HP_ID_COUNT > i; i++) /* 反向条件以避免 lt 符号 */ printf(" %2d=%3d/%3d\n", i, hp_starts[i], hp_starts[i+1]-hp_starts[i]); printf("ID 是:\n"); #define HP_ITEM(name, length) printf(" %2d=%s\n",HPID_##name, #name); HP_LIST #undef HP_ITEMS }是否有任何命名此类标识符的常规约定以最大程度地减少冲突的可能性,并尽量减少它们可能产生的任何混淆?在上述场景中,标识符 ZZQ_xxx 将与 hp_starts[HPID_xxx] 相同,并且在某些情况下可能很有用,尽管它们的主要目的是构建数组并用作计算其他 ZZQ 值和 HP_TOTAL_SIZE 的占位符。然而,标识符 ZZQX_xxx 是无用的;它们的唯一目的是在为后续项目设置枚举值时充当占位符。有什么好的方法来命名这些东西吗?
顺便说一下,我为小型微控制器开发的 RAM 比代码空间更宝贵。代码是通过在 Microsoft VC++ 上编译来模拟的,但对于生产是使用直接 C 中的交叉编译器编译的;因此,代码必须在 C 和 C++ 中编译。
对于类似的任务,人们可以推荐任何其他预处理器技巧吗?
【问题讨论】:
标签: c++ c c-preprocessor naming