#ifdef不接受枚举定义

问题描述 投票:0回答:4

我目前正在开发一个涉及7个文件的项目:main.cppGpioInterface.hGpioInterface.cppUtility.hUtility.cpp

基本上在main.cpp文件中我使用#define BOARD_TYPE WHATEVER声明了板类型然后在GpioInterface.h中我定义了一些值,如果已经定义了这个宏。

它看起来像这样:

main.cpp中:

#define __USE_BOARD_ WHATEVER // This should go in an external file in the future
#ifdef __USE_BOARD_
    // Define some stuff
#endif

#include "GpioInterface.h"
#include "Utility.h"

// main function here

GpioInterface.h:

#ifndef GPIO_INTERFACE_H
#define GPIO_INTERFACE_H

#include <stdint.h>
#include <stdio.h>

#ifdef __USE_BOARD_

enum GPIO_PIN_MODE {
    GPIO_PIN_MODE_OUTPUT = 0x00,
    GPIO_PIN_MODE_INPUT = 0x01,
};

enum GPIO_PIN_STATE {
    GPIO_PIN_STATE_LOW = 0x00,
    GPIO_PIN_STATE_HIGH = 0x01,
};

#endif // __USE_BOARD_
// some other stuff
#endif // GPIO_INTERFACE_H

Utility.cpp:

#include "Utility.h"
#include "GpioInterface.h"

void someFunction() {
    GPIO_digitalWrite(2, GPIO_PIN_STATE_HIGH); // Write HIGH in pin 2
}

编译时,GpioInterface.h文件给我以下错误'GPIO_PIN_STATE_HIGH' was not declared in this scope

任何想法如何使GpioInterface.h中定义的枚举对Utility.cpp可见?

谢谢!

c++ c enums
4个回答
2
投票

main.cpp由于正确编译

#define __USE_BOARD_ WHATEVER // This should go in an external file in the future

在开始。在Utility.cpp中你没有那个定义所以包含“GpioInterface.h”没有定义枚举。


2
投票

理想情况下,应将此类定义移至编译时选项,例如:如果您使用的是gcc,它应该看起来像gcc -D__USE_BOARD_ = WHATEVER,请参阅:

https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

g ++存在类似选项,对于MSVC(++)也存在,请参阅:

https://docs.microsoft.com/en-us/cpp/build/reference/d-preprocessor-definitions

优点是这些是给定平台的编译时配置,无需更改每个平台的代码并找出定义宏的位置(如在您的情况下)。


1
投票

除非您的GpioInterface.h文件或其中包含的文件之一具有__USE_BOARD_的宏定义,否则将不会有一个,并且#ifdef __USE_BOARD_将评估为false并且将不会定义enums。当编译器编译Utility.cpp时,它将没有GPIO_PIN_STATE_HIGH的定义,你将得到一个错误。


0
投票

最简单的方法是简单地删除枚举周围的#ifdef

或者,您可以通过编译器参数传递__USE_BOARD_,例如在他的答案中提到的amritanshu,或者(最好)在构建配置设置(例如IDE)中声明它。

如果您不希望/可以出于某种原因使用任何IDE或构建工具,我建议为全局定义创建一个额外的头,并将其包含在需要的任何地方。然而,这并不是很干净,我总是更喜欢使用构建配置。

© www.soinside.com 2019 - 2024. All rights reserved.