arduino 中的预处理器断言

标签 preprocessor arduino

是否有办法在编译时向 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/

相关文章:

c++ - 使用类继承和 malloc(在 arduino 上)

c++ - Arduino 平台编译器标志

python - 您将如何在 Python 中执行相当于预处理器指令的操作?

c# - 如何在 Unity3D 中的 c##error 预处理器中打印 URL?

c - 为什么预处理器需要大括号才能有语句?

c - 预处理在此代码段中如何工作?

arduino - 如何让Arduino运行脚本

c++ - g++ 4.8.5 : does not give a valid preprocessing token using ##

.net - ESP8266 - .Net 可行吗?

使用 arduino mega 2560 的计数器模式定时器