#ifdef [真实条件] #endif块。注释掉#ifdef和#endif行更改会编译吗?

时间:2019-02-05 04:10:40

标签: c++ conditional-compilation

我有两个头文件。在#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行时,它会消失,这些行本应由曾经见过受保护的代码的预处理器删除。

有什么想法吗?

0 个答案:

没有答案