我正在为Linux + AVR Arduino项目创建软件。显然,整个工作分为Eclipse中的几个项目(我没有使用Arduino IDE)。我想为所有这些项目使用常见的,主要是字符串的常量。我还需要备用微控制器的RAM,因此需要编译时常量。我该如何最好地实现它?我的想法是为这些常量创建一个单独的,仅限标题的项目。
使用:
class A {
public:
static const char * const STRING;
static const unsigned char BOOL;
};
不够好,因为我希望能够连接像这样的字符串常量:
class A {
public:
static const char * const STRING_PART1;
static const char * const STRING_PART2;
static const unsigned char BOOL;
};
const char * const A::STRING_PART1 = "PART1_";
//const char * const A::STRING_PART2 = A::STRING_PART1 + "PART2"; //obviously won't compile
//const char * const A::STRING_PART2 = strcat("PART2", A::STRING_PART1); //this is not compile-time
我也不想使用define
。我想用:
class A {
public:
static const std::string STRING_PART1;
static const std::string STRING_PART2;
}
允许字符串连接并且是(AFAIK)编译时,但std :: string在avr项目中不可用 - 或者我在这里错了,只是不知道如何使用它。
任何帮助表示感谢。
答案 0 :(得分:3)
您可以继续使用const char* const
的当前想法(如果std::string
不可用)。我建议仅将#define
用于分配目的。例如:
class A {
public:
static const char * const STRING_PART1;
static const char * const STRING_PART2;
static const unsigned char BOOL;
};
#define PART1_ "PART1_" // <--- for value assignent
#define PART2_ "PART2_"
const char * const A::STRING_PART1 = PART1_;
const char * const A::STRING_PART2 = PART1_ PART2_; // <--- ok! concatenation by compiler
答案 1 :(得分:1)
编译时间意味着它存储在ROM(例如微控制器的闪存)中,其中运行时变量存储在RAM中。在我的情况下,它是我必须备用的RAM。编译器根据许多规则决定放置变量的位置。定义是编译时常量的一个例子,它们显然不计入RAM使用。另一个例子应该是静态类常量 - 但在这种情况下我的编译器会另外决定。当然,我可能会混淆一些事情。
我认为你实际上是令人困惑的事情:
如果要将程序存储器(= AVR闪存)用于常量字符串,请使用avr / pgmspace.h中的PSTR宏。