'ClassName' 和 'ClassInstance' 未在此范围内声明
'ClassName' and 'ClassInstance' was not declared in this scope
我正在尝试在 Atmel Studio 中使用 C++ 对 Atmel SAM D21 微控制器进行编程。我正在尝试使用片上定时器之一创建周期性硬件中断。
我创建了 Timer4
class 来设置来自 main.cpp
的计时器。我试图在主函数中创建一个名为 MyTimer4
的 Timer4
实例,但它显示
'Timer4' was not declared in this scope
'MyTimer4' was not declared in this scope
我看到许多类似的讨论指向 incorrect/circular #include
s。但是,我自己似乎没有看到同样的问题。有任何想法吗?
Main.cpp
#include "timerSAMD21.h"
#include "sam.h"
void SampleADC(void)
{
}
int main(void)
{
SystemInit();
Timer4 MyTimer4;
MyTimer4.setRate(1000);
MyTimer4.onEvent(SampleADC);
MyTimer4.start;
}
timerSAMD21.h
#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
timerSAMD21.cpp
#include "timerSAMD21.h"
voidFuncPtr callback = NULL;
void Timer4::setRate(int frequency) {
configure(frequency);
}
void Timer4::start(void) {
enable();
}
void Timer4::end(void) {
disable();
reset();
}
void Timer4::configure(int frequency) {
//Configuration code here. Removed for Stack Overflow.
}
void Timer4::enable(void){
REG_TC4_CTRLA |= TC_CTRLA_ENABLE; //Enable timer
while (TC4->COUNT8.STATUS.bit.SYNCBUSY);
}
void Timer4::disable(void) {
REG_TC4_CTRLA &= ~TC_CTRLA_ENABLE;
while (TC4->COUNT8.STATUS.bit.SYNCBUSY);
}
void Timer4::reset(void) {
REG_TC4_CTRLA = TC_CTRLA_SWRST;
while (TC4->COUNT8.STATUS.bit.SYNCBUSY);
while (TC4->COUNT8.CTRLA.bit.SWRST);
}
void Timer4::onEvent(voidFuncPtr funcOnEvent){
callback = funcOnEvent;
}
#ifdef __cplusplus
extern "C" {
#endif
void IRQHandlerTimer4(void) {
if (callback != NULL)
{
callback();
}
REG_TC4_INTFLAG = TC_INTFLAG_MC0;
}
#ifdef __cplusplus
}
#endif
(注意:做出回答是为了将此问题从未回答的问题列表中剔除。Miles 似乎已决定不回答,我不认为该问题是打字错误。)
您试图阻止重新包含 header 的方式导致它仅在 guard-macro 恰好已经定义的情况下才使 header 的内容可见,这当然从来没有。
为了解决这个问题,更改
#ifdef TIMERSAMD21_H
#define TIMERSAMD21_H
进入
#ifndef TIMERSAMD21_H
#define TIMERSAMD21_H
这将首先使 header 内容在第一次包含时可见。
然后它将定义保护宏,这将防止 header 内容在同一翻译单元(即代码文件)中被第二次编译。
我正在尝试在 Atmel Studio 中使用 C++ 对 Atmel SAM D21 微控制器进行编程。我正在尝试使用片上定时器之一创建周期性硬件中断。
我创建了 Timer4
class 来设置来自 main.cpp
的计时器。我试图在主函数中创建一个名为 MyTimer4
的 Timer4
实例,但它显示
'Timer4' was not declared in this scope
'MyTimer4' was not declared in this scope
我看到许多类似的讨论指向 incorrect/circular #include
s。但是,我自己似乎没有看到同样的问题。有任何想法吗?
Main.cpp
#include "timerSAMD21.h"
#include "sam.h"
void SampleADC(void)
{
}
int main(void)
{
SystemInit();
Timer4 MyTimer4;
MyTimer4.setRate(1000);
MyTimer4.onEvent(SampleADC);
MyTimer4.start;
}
timerSAMD21.h
#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
timerSAMD21.cpp
#include "timerSAMD21.h"
voidFuncPtr callback = NULL;
void Timer4::setRate(int frequency) {
configure(frequency);
}
void Timer4::start(void) {
enable();
}
void Timer4::end(void) {
disable();
reset();
}
void Timer4::configure(int frequency) {
//Configuration code here. Removed for Stack Overflow.
}
void Timer4::enable(void){
REG_TC4_CTRLA |= TC_CTRLA_ENABLE; //Enable timer
while (TC4->COUNT8.STATUS.bit.SYNCBUSY);
}
void Timer4::disable(void) {
REG_TC4_CTRLA &= ~TC_CTRLA_ENABLE;
while (TC4->COUNT8.STATUS.bit.SYNCBUSY);
}
void Timer4::reset(void) {
REG_TC4_CTRLA = TC_CTRLA_SWRST;
while (TC4->COUNT8.STATUS.bit.SYNCBUSY);
while (TC4->COUNT8.CTRLA.bit.SWRST);
}
void Timer4::onEvent(voidFuncPtr funcOnEvent){
callback = funcOnEvent;
}
#ifdef __cplusplus
extern "C" {
#endif
void IRQHandlerTimer4(void) {
if (callback != NULL)
{
callback();
}
REG_TC4_INTFLAG = TC_INTFLAG_MC0;
}
#ifdef __cplusplus
}
#endif
(注意:做出回答是为了将此问题从未回答的问题列表中剔除。Miles 似乎已决定不回答,我不认为该问题是打字错误。)
您试图阻止重新包含 header 的方式导致它仅在 guard-macro 恰好已经定义的情况下才使 header 的内容可见,这当然从来没有。
为了解决这个问题,更改
#ifdef TIMERSAMD21_H
#define TIMERSAMD21_H
进入
#ifndef TIMERSAMD21_H
#define TIMERSAMD21_H
这将首先使 header 内容在第一次包含时可见。
然后它将定义保护宏,这将防止 header 内容在同一翻译单元(即代码文件)中被第二次编译。