是否有办法在编译时向 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 中发出编译时错误信号吗?
最佳答案
预处理器可能会生成错误,但请记住它在编译时间之前运行。它只是处理源文件,按照预处理器指令的指示进行替换和翻译。严格来说,它并不关心你的文件是否是 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;
关于arduino 中的预处理器断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14883337/