4

我正在为 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 项目中不可用 - 或者我在这里错了,只是不知道如何使用它。

任何帮助表示赞赏。

4

2 回答 2

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
于 2011-09-07T08:41:06.593 回答
1

对我来说,编译时间意味着它存储在 ROM(例如微控制器的闪存)中,而运行时变量存储在 RAM 中。就我而言,这是我必须备用的 RAM。编译器根据许多规则决定将变量放在哪里。定义是编译时常量的一个例子,它们显然不计入 RAM 使用量。另一个例子应该是静态类常量——但在这种情况下,我的编译器会做出不同的决定。当然,我可能会混淆一些事情。

我认为您实际上使事情变得混乱:

  • 定义不存储在 ROM 中 - 它们根本不是程序的一部分,因为它们已经由预处理器进行评估。
  • 您所做的“编译时间”和“运行时间”之间的区别适用于评估,而不是存储。

如果要将程序存储器(= AVR 闪存)用于常量字符串,请使用 avr/pgmspace.h 中的 PSTR 宏。

于 2011-09-07T11:12:18.690 回答