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) コンパイル時ですが、avr プロジェクトでは std::string を使用できません。または、ここで間違っていて、使用方法がわかりません。

どんな助けでも感謝します。

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

私にとってコンパイル時間とは、ランタイム変数がRAMに保存されるのに対し、ROM(マイクロコントローラのフラッシュなど)に保存されることを意味します。私の場合、余裕を持たなければならないのは RAM です。コンパイラは、多くの規則に基づいて変数を配置する場所を決定します。定義はコンパイル時の定数の 1 つの例であり、明らかに RAM の使用量にはカウントされません。他の例は、静的クラス定数であるべきですが、この場合、私のコンパイラは別の方法で決定します。もちろん、私は物事を混乱させるかもしれません。

あなたは実際に物事を混乱させていると思います:

  • 定義は ROM に格納されません。定義は、プリプロセッサによって既に評価されるため、プログラムの一部ではありません。
  • あなたが作っている「コンパイル時」と「実行時」の違いは、ストレージではなく評価に適用されます。

定数文字列にプログラム メモリ (= AVR フラッシュ) を使用する場合は、avr/pgmspace.h の PSTR マクロを使用します。

于 2011-09-07T11:12:18.690 に答える