#ifdef不接受枚举定义

时间:2017-12-19 10:48:42

标签: c++ c enums

我目前正在开发一个涉及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可见吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

由于

main.cpp被正确编译

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

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

答案 1 :(得分: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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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