2

如果有办法在编译时向 Arduino 预处理器发出停止/中止信号?

一般来说,我对高级预处理器指令不是很熟悉,但我已经看到在某些编译器中存在用于编译时断言的“库”。

背景:

为了防止在代码中分配重复的引脚,我创建了一个枚举来识别每个引脚

enum DataPins
{
    /* 00 */ UNUSED_00,
    /* 01 */ UNUSED_01,
    /* 02 */ PIN_IN_SNR0_ECHO,
    /* 03 */ PIN_IN_SNR1_ECHO,
...
    /* 53 */ UNUSED_53,
    /* check */ z_DONOTUSE54
};

然后我想检查最终名称以确保它在编译时具有正确的值:

#define PinsOK  z_DONOTUSE54==54

有没有办法在编译时评估它?如果是这样,那么基于该结果,我可以在 Arduino 中发出编译时错误信号吗?

4

2 回答 2

1

我建议查看http://code.google.com/p/sdfatlib/downloads/list上的 ..\SdFat\utility\DigitalPin.h 。它演示了管脚检查和预编译断言“属性((错误(“管脚号太大或不是常数”));“ 这类似于 digitalWriteFast.h,但更进一步。在这两个示例中,他们正在测试引脚是静态的还是可变的。与你的目标略有不同。

于 2013-02-18T14:55:58.903 回答
1

预处理器可能会产生错误,但请记住它在编译时间之前运行。它只是按照预处理器指令的指示处理源文件进行替换和翻译。严格来说,你的文件甚至是 C++ 源代码都不在乎。

所以不,预处理不能知道 enum {} 定义的内容。

但是,如果您仍然需要问题的错误方面:

#define X

#ifdef X
#error ERROR my message
#endif

如果您正在寻找替代方法来节省一些输入并始终如一地构造枚举名称,则可以使用预处理器来构造枚举行。如果您明确分配值,您可能不会关心引脚中的间隙。

#define P(no_,name_) Pin##name_ = no_
#define U(no_) PinUnused##no_ = no_

enum {
    P(0,Abc),
    U(1),
    P(2,Something),
    P(15,OutWhatever)
};


int p;
p = PinAbc;
p = PinUnused1;
p = PinSomething;
于 2013-02-15T06:55:22.187 回答