我有两个头文件。在#ifdef [symbol] ... lota代码#endif#定义了另一个符号中使用的符号后,另一个调用了。
在VS2017中,#ifdef和#endif之间的代码显示为“活动”(未灰显),因此它认为[symbol]为true,并将代码包含在活动代码集中。
但是,如果我注释掉#ifdef [symbol]和#endif行,则编译的结果会急剧变化-怎么可能?我认为#ifdef和#endif宏是预处理程序指令,并且出于编译代码的目的根本不存在。如果#ifdef [symbol]评估为true,我以为它们就消失了。我想念什么?
第一个头文件:
#ifndef _MPU6050_6AXIS_MOTIONAPPS20_H_
#define _MPU6050_6AXIS_MOTIONAPPS20_H_
#include "I2Cdev.h"
#include "helper_3dmath.h"
// MotionApps 2.0 DMP implementation, built using the MPU-6050EVB evaluation board
#define MPU6050_INCLUDE_DMP_MOTIONAPPS20
#include "MPU6050.h"
在第二个头文件(MPU6050.H)中,有一个'Class MPU6050'的长类定义,该定义具有受
保护的块。#ifdef MPU6050_INCLUDE_DMP_MOTIONAPPS20
....
....
....
#endif
(我认为)这是我一直试图追查的一些“单一定义规则”违规的来源,因此,作为一项实验,我注释掉了#define和#endif行,认为现在只有一个“ MPU6050级”的可能定义和寿命会很好。实际发生的是编译器产生了很多“未定义符号”错误,好像毕竟还没有定义“ MPU6050_INCLUDE_DMP_MOTIONAPPS20”符号并且保护线防止被编译一样,即使VS2017的Intellisense将其显示为“活动”。
由于定义了符号“ MPU6050_INCLUDE_DMP_MOTIONAPPS20”,因此无论是否确实存在#ifdef和#endif行,对MPU6050.H中的受保护代码都应进行编译,对吗?
我想念什么?
实际文件为Jeff Rowberg's i2cDev GitHub account处Arduino \ MP6050文件夹中的MPU6050_6Axis_MotionApps20.h和MPU6050.H。
TIA,
坦率
19/06/02补充:作为一项测试,我在#ifdef /#endif保护的块中放置了“已知错误”行,并且编译器将该行标记为错误。我相信,从编译器的角度来看,这证明了受保护的块确实是“活动的”。
此外,我注释了MPU6050_6Axis_MotionApps20.h中的行,该行#定义了“ MPU6050_INCLUDE_DMP_MOTIONAPPS20”符号。现在,编辑器将受保护的代码显示为“不活动”(显示为灰色),并且编译器将始终如一地进行操作(抱怨缺少受保护的代码部分中的函数声明)。
所以,我有一个悖论。编译器认为受保护的代码是活动的,但是当我注释掉#ifdef和#endif行时,它会消失,这些行本应由曾经见过受保护的代码的预处理器删除。
有什么想法吗?