如果我从WotClass.h中注释掉#define行,则会出现编译错误:WotClass.cpp:7: error: 'BFLM_DEFINE' was not declared in this scope

它不是应该独立于范围吗?还是顺序有问题?

WotClass.h

#ifndef WOTCLASS_H
#define WOTCLASS_H

#define BFLM_DEFINE 1 // if commented out then compile fails.

class WotClass{
    public:
        WotClass();
        int foo();
    private:
};

#endif


WotClass.cpp

#include "WotClass.h"

WotClass::WotClass(){}

int WotClass::foo(){
    return BFLM_DEFINE;
}


Test.ino

#define BFLM_DEFINE 1 // This is before including class
#include "WotClass.h"

void setup(){
    Serial.begin(115200);
    Serial.println(BFLM_DEFINE);
    WotClass x;
    Serial.print(x.foo());
}

void loop(){}

最佳答案

考虑WtoClass.cpp的编译:


首先,预处理器引入了WotClass.h。由于您已注释掉#define,因此这意味着WotClass.h没有定义BFLM_DEFINE
不知道什么是Test.ino,但是至少从您的代码来看,它与WotClass.cpp的编译无关。


因此,在编译此源时,BFLM_DEFINE的确是未定义的。可能是在其他一些源文件中定义的,但这与该编译单元无关。这正是编译器告诉您的内容:

WotClass.cpp:7: error: 'BFLM_DEFINE' was not declared in this scope

09-26 15:18