我写固件一PIC32MX,使用高技术PICC32.其中一个问题我想要避免的是,由于大多数的脚有多个名称(如。AN0=RB0=CN2=PGED1),我或其他人可能会意外地使用RB0没有意识到,AN0已经使用。(这可能实际上是灾难性的,因为错误配置模拟/数字销可能会导致过度当前绘制和释放的重要吸烟。)

以及全面记载每一个销使用,我在想,如果有一个快速的方式到头这个问题在该级别的编码。我想一个宏人(主要是我自己)可以使用说 CLAIM_PIN(58), 那将发出一个警告或错误,如果它运行的两倍。

(我不想在这的所有费用,如果唯一可能的解决办法是太可怕的或不可维护然后我会忘掉它,只是发展一个信誉流泪或设置自己在火或什么的。我也看到了这个问题 宏产生的宏, ,其中规则。)

我应该澄清:代码被写入在多个编译单位(至少,我认为这是什么语装置)。我有一个.h/.c文件为我A2D代码、类似于SPI,并同样用于各种外围设备,只是使用某些I/O口。空间不是 真的 一个问题,我的代码叶足够的空间上的PIC32MX;我也可以使用另一个__"调试"标志删除该脚检查代码最终使用。

有帮助吗?

解决方案

好吧,在这里。没有运行成本。

#define CLAIM(n) struct busy##n {}

CLAIM(58);
CLAIM(58);

如果进行两次,它将错误:

z.c:4: error: redefinition of ‘struct busy58’

延长检查多个编译单位,你会想到包裹的宏在 #if DEBUG 因为我们将使用连接到检测的冲突,因此会有一个运行时间足迹。

#define CLAIM(n) char busy##n = 1;
#define CLAIM(n) void busy##n() {} // bdonlan

其他提示

#define CLAIM_PIN(n) char claimed_pin_##n;

现在当两个代码试图要求销,符号将是加倍的定义和任的编纂者或接器将产生一个错误。

编辑: 根据评论意见,这可能会变得更好:

#define CLAIM_PIN(n) void claimed_pin_#nn(void) {}

如果你可以负担得起的运行开销,或者如果这仅仅是进行调试,我只是创建一样的东西 IOPinOpen() 功能,跟踪销在使用,而不是处理宏观诡计。

另一方面, 标记赎金的最新答案 值得a+1.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top