此代码无法编译:
#ifndef RemoteControl_h
#define RemoteControl_h
#include "Arduino.h"
class RemoteControl
{
public:
RemoteControl();
~RemoteControl();
static void prev_track();
static void next_track();
static void play_pause_track();
static void mute();
static void vol_up();
static void vol_down();
void respond(int code);
void add_code(int code, void (*func)());
private:
boolean active = true;
struct pair {
int _code;
void (*_func)();
};
const int max = 1000;
int database_length = 0;
pair database[max]; //This line doesn't compile unless I use a literal constant instead of "max"
};
#endif
但是,如果我将下面的部分放在类的构造函数中,那么它可以正常工作。
const int max = 1000;
int database_length = 0;
pair database[max];
我不允许在c ++中的类中声明一个数组并使用虚拟常量作为长度吗?我在arduino工作,如果这有所作为,但我希望我不理解c ++语言的东西,因为这是一个标准的.h文件。哦,问题不在于.cpp文件,因为我用相同的结果完全删除了它:用文字常量长度编译但不是虚拟常量长度。
答案 0 :(得分:1)
首先让我为你澄清一些事情。
在C
中,const
变量被视为const
- 限定,它不是编译时常量值(与整数文字不同,这是一个编译时间常数值)。因此,根据正常数组大小规范的规则,在这种情况下甚至无法使用const
变量。
在C
中,我们可能有使用VLA的条款,即使pair database[max]
也可以使用max
之类的语法}不是const
变量,而是编译器的一些可选功能(根据C11
)。
在C++
中,我们可以使用const
变量作为数组的大小,如C++
中所示,const
变量是编译时常量。
所以,回答你的问题:
C
中,如果您的编译器支持VLA,您的代码就可以了。即使max
不是const
。C++
中,没有VLA,但可能支持作为gnu扩展名。如果max
为const
,则可以。答案 1 :(得分:1)
在C或C ++中,尝试在malloc()
中使用stdlib.h
,在{+ 1}}中使用c ++。别忘了cstdlib
free()
答案 2 :(得分:0)
最简单的解决方法就是采取
const int max = 1000;
走出课堂,把它放在课堂上面。
更好的方法是确保它是一个编译时常量,如下所示:
constexpr int max = 1000;