我有以下问题:
我正在为一组与微控制器一起使用的传感器编写一个集合库。意思是我为传感器和摘要采用了很多库并简化它们……
正如评论和其他答案所指出的那样 #define 指令仅在包含它们的文件中可见。所以有
#define
#define IR_SENSOR_USED
在 Sensors.cpp 不会影响任何未编译的代码 Sensors.cpp (重要的是,它会影响包含在其中的代码 .h 包含在的文件 Sensors.cpp 之后 #define 。但它不会影响不同的东西 .cpp 文件。
Sensors.cpp
.h
.cpp
比Arduino更复杂的构建环境有更好,更复杂的方法来处理这个问题,但Arduino世界并没有给你很多工具来处理这个问题。
我在Arduino世界中做的只是有一个名为的文件 config.h 其中包含所有 #define 在项目范围内我需要的陈述。一世 #include "config.h" 在每个需要这些值的文件中。
config.h
#include "config.h"
因此,在您的情况下,您将使用所有定义来显示使用哪些设备 config.h 然后 #include "config.h" 在每个依赖它的文件的开头。
你甚至可以在你的开头包括它 Sensors.h 文件。我会考虑将两个文件分开,以便在需要配置的东西和有用的代码之间存在明确的界限。
Sensors.h
我还在此文件中保留任何敏感值(wifi凭据,密码,API密钥),并将其从我在Github上发布的代码中排除。在它的位置,我包含一个“config-example.h”文件,其中包含所有指令但具有虚拟值,因此使用该代码的其他人可以编辑和重命名它。
这个问题可能是一个例子 XY问题 。
如果您希望库的用户选择他们需要的功能,那么将声明放在单独的头文件中会更有意义。例如。, IR_sensor.h 然后
IR_sensor.h
#define IR_SENSOR_USED #include "Sensors.h"
变得公正 #include "IR_sensor.h" 。
#include "IR_sensor.h"
如果库的大小是或关注的,可以选择将其拆分为单独的库。
第三种选择是将功能提供为 仅标头 图书馆。
的 确切答案: 强>
这是什么原因? (为什么)预处理器不执行 .cpp文件中的指令是否正确?
最可能的原因是 Sensors.cpp 没有意识到 #define IR_SENSOR_USED 。定义在另一个未包含的文件中。
但即使如此 IR_SENSOR_USED 将被定义为 Sensors.cpp 另一个问题出现了:重新编译 Sensors.cpp 因为每种可能的定义组合都是必要的。否则,ifdefed-code从编译中排除,不能通过调用在客户端简单地启用 #define 。
IR_SENSOR_USED