未在此范围内声明“ ClassName”和“ ClassInstance”

时间:2018-07-31 04:08:15

标签: c++ arm embedded atmelstudio samd21

我正在尝试在 Atmel Studio 中使用C ++对 Atmel SAM D21 微控制器进行编程。我正在尝试使用片上计时器之一创建定期的硬件中断。

我创建了Timer4类来从main.cpp设置计时器。我试图在主函数中创建一个名为Timer4的{​​{1}}实例,但是它说

MyTimer4

我已经看到许多类似的讨论,它们指向不正确/圆形的'Timer4' was not declared in this scope 'MyTimer4' was not declared in this scope 。但是,我似乎自己没有看到相同的问题。有任何想法吗?


Main.cpp

#include

timerSAMD21.h

#include "timerSAMD21.h"
#include "sam.h"

void SampleADC(void)
{

}

int main(void)
{
    SystemInit();

    Timer4 MyTimer4;

    MyTimer4.setRate(1000);
    MyTimer4.onEvent(SampleADC);
    MyTimer4.start;
}

timerSAMD21.cpp

#ifdef TIMERSAMD21_H
#define TIMERSAMD21_H

#include "tc.h"
#include "tc4.h"
#include "gclk.h"

typedef void (*voidFuncPtr)(void);

class Timer4
{

public:

    Timer4() {};
    void setRate(int frequency);
    void start(void);
    void end(void);
    void onEvent(voidFuncPtr funcOnEvent); 

private:

    void configure(int frequency);
    void enable(void);
    void disable(void);
    void reset(void);
};

#endif

1 个答案:

答案 0 :(得分:3)

(注意:做出答案是为了将其从未回答的问题列表中删除。Miles似乎决定不回答,我也不认为这个问题是错字。)

您试图防止重新包含标头的方式是,如果仅在定义了保护宏的情况下,它才使标头的内容可见,这当然是从来没有的。

要解决此问题,请更改

#ifdef TIMERSAMD21_H
#define TIMERSAMD21_H

进入

#ifndef TIMERSAMD21_H
#define TIMERSAMD21_H

在第一次包含标头内容时,这将首先使标头内容可见。
然后,它将定义保护宏,以防止标头内容在同一翻译单元(即代码文件)中第二次编译。