gpt4 book ai didi

c++ - 对 ifdef block 内函数的 undefined reference

转载 作者:行者123 更新时间:2023-11-28 01:23:32 24 4
gpt4 key购买 nike

我有以下问题:

我正在为一组要与微 Controller 一起使用的传感器编写一个集合库。这意味着我使用了很多传感器库,并在一个学生项目的统一库中对它们进行了抽象和简化。

我使用 #define 结构来确定学生想要使用和连接的传感器。

例子:

#define IR_SENSOR_USED

然后在库的 .h 和 .cpp 文件中,我使用 #ifdef-#endif 对来定义和声明给定传感器的函数以及包括给定的库。

我的 Sensors.h 文件中的示例:

#ifdef IR_SENSOR_USED
#include "SparkFun_GridEYE_AMG88/src/SparkFun_GridEYE_Arduino_Library.h"
extern GridEYE grideye;
void setup_ir_sensor();
void read_ir_sensor();
void enable_ir_interrupt(float lower, float upper, float hysteresis);
void disable_ir_interrupt();
#endif

从我的 Sensors.cpp 文件:

#ifdef IR_SENSOR_USED
void setup_ir_sensor() {
Wire.begin(16, 17, 0x69);
grideye.begin(0x69, Wire);
}

void read_ir_sensor() {
for (int i = 0; i <= 64; i++) {
sensor_values.ir_pixel_temp[i] = grideye.getPixelTemperature(i);
}
sensor_values.ir_device_temp = grideye.getDeviceTemperature();
}

void enable_ir_interrupt(float lower, float upper, float hysteresis) {...}

void disable_ir_interrupt() {...}
#endif

但是,只要我在 .cpp 文件中有 #ifdef,如果我尝试调用 setup() 中的函数,就会出现以下错误:

sketch/Sensors.ino.cpp.o:(.literal._Z5setupv+0xc): undefined reference to `read_ir_sensor()'
sketch/Sensors.ino.cpp.o: In function `setup()':
.../Sensors/Sensors.ino:112: undefined reference to `read_ir_sensor()'
collect2: error: ld returned 1 exit status
exit status 1

如果我将它们注释掉,代码执行正常。另一个函数 (setup_sensors()),它也在 Sensors.h.cpp 文件中并且没有被 包围#ifdef 也可以正常工作。

这是我的 Sensors.ino 草图:

#define IR_SENSOR_USED
//#define COLOR_SENSOR_USED
//#define ENV_SENSOR_USED
//#define TEMP_SENSOR_USED

#include "Sensors.h"

void setup() {
sensor_setup();

read_ir_sensor();
}

void loop() {
}

这是什么原因? (为什么)预处理器没有正确执行.cpp 文件中的指令?

最佳答案

正如评论和其他答案所指出的,任何 #define 指令仅在包含它们的文件中可见。所以有

#define IR_SENSOR_USED

Sensors.cpp 中不会影响任何未在 Sensors.cpp 中编译的代码(重要的是,它会影响包含在 .h< 中的代码 文件包含在 #define 之后的 Sensors.cpp 中。但它不会影响包含在不同的 .cpp 中的任何内容文件。

比 Arduino 更复杂的构建环境有更好、更复杂的方法来处理这个问题,但 Arduino 世界并没有给你很多工具来处理这个问题。

我在 Arduino 世界中所做的只是拥有一个名为 config.h 的文件,其中包含我在项目范围内需要的所有 #define 语句。我在每个需要这些值的文件中#include "config.h"

因此,在您的情况下,您可以将所有显示在 config.h 中使用的设备的定义放在 #include "config.h" 中依赖于它的每个文件的开头。

您甚至可以将其包含在 Sensors.h 文件的开头。我会考虑将这两个文件分开,以便在需要配置的内容和有用代码的内容之间有明确的界限。

我还在这个文件中保留了任何敏感值(wifi 凭据、密码、API key ),并将其从我在 Github 上发布的代码中排除。取而代之的是,我包含一个“config-example.h”文件,其中包含所有指令,但具有虚拟值,以便使用该代码的其他人可以编辑和重命名它。

关于c++ - 对 ifdef block 内函数的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55021391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com