1

コンパイル時に C 文字列リテラルの長さを探しています。定義を考えると:

static const char * const   header_left[] =
{
    "         |          |  Raw  |  Raw  |",
    "         |          | Start |  End  |",
    "Interval#| Duration | Point | Point |",
    "---------+----------+-------+-------+",
};
const unsigned int  rows_in_header = sizeof(header_left) / sizeof(header_left[0]);

header_left[2]を使用せずに文字列リテラルの長さを見つけるにはどうすればよいstrlenですか?

この質問、文字列リテラルの長さの決定には、配列を として宣言するコメントがありheader_left[][4]ます。数量定数を変更せずに文字列の数を変更する傾向があるため、この種の宣言を使用しないことを好みます。私は、コンパイラーに文字列の量 (rows_in_header定義を参照) と各文字列の長さを計算させるのが好きです。

これは組み込みシステム用で、文字列はシリアル ポートにブロックで書き込まれます。シリアル ポート関数は、データへのポインターとデータの長さをパラメーターとして受け取ります。シリアル ポート コードは、ブロック書き込み用に最適化されています。strlenパフォーマンス時間が無駄になるため、 使用しないことをお勧めします。

ARM7TDMI プラットフォーム上の IAR Embedded Workshop で C99 を使用しています。
タグを含めたのはc++、これには C++ も含まれており、最初の製品の発売後にコードを C++ に移行する予定だからです。

4

4 に答える 4

1

実際、リンクされた回答のアドバイスは間違っています。インデックスが逆になっているためです。宣言は、次の行に沿ったものにする必要があります。

static const char header_left[][40] =
{
    "         |          |  Raw  |  Raw  |",
    "         |          | Start |  End  |",
    "Interval#| Duration | Point | Point |",
    "---------+----------+-------+-------+",
};

一番左のインデックスはコンパイラによって引き続き提供され、文字列の数を示します。文字列自体は、上限 (この例では 40) を指定できる固定の char 配列でなければなりません。文字列がその長さを超えると、コンパイル エラーが発生します (ヌル ターミネータを含む)。あなたの目的の潜在的な欠点は、無駄なスペースです。

いずれにせよ、コンパイラに両方のサイズ (両方の配列のサイズ) を推測させることはできません。ジャグ配列は C++ ではサポートされていません。

于 2013-05-01T18:09:36.223 に答える
1

マクロマジック!(>= C99) 少なくとも 2 行が必要です。

char const*ここではbutを使用しないことに注意してくださいchar const[...]。つまり、配列は可能であり、すべての行が同じ長さであることを保証するためです。

編集: から -1 を引いlength_of_rowて を取り除き'\0'ます。

#include<cstddef>
#define CREATE_HEADER(X, ...) \
  static const size_t length_of_row = sizeof(X)/sizeof(X[0]) - 1; \
  static const char header_left[][length_of_row+1] = { X, __VA_ARGS__ }; \
  static const size_t rows_in_header = sizeof(header_left) / sizeof(header_left[0]); \

CREATE_HEADER(
    "         |          |  Raw  |  Raw  |",
    "         |          | Start |  End  |",
    "Interval#| Duration | Point | Point |",
    "---------+----------+-------+-------+",
);

  • sizeof(X)/sizeof(X[0])最初の文字列 (行) の長さを返します
  • static const char header_left[][length_of_row]length_of_rowcharの配列の無制限配列です。と同じtypedef char const row[length_of_row]; row header_left[] = {...};
于 2013-05-01T18:16:36.813 に答える
0

header_left[2]文字列を抽出して使用できますsizeof(...) - 1

static const char header_left_2[] = "Interval#| Duration | Point | Point |";
static const char * const   header_left[] =
{
    "         |          |  Raw  |  Raw  |",
    "         |          | Start |  End  |",
    header_left_2,
    "---------+----------+-------+-------+",
};
const unsigned int  rows_in_header = sizeof(header_left) / sizeof(header_left[0]);
const size_t header_left_2_len = sizeof(header_left_2) - 1;
于 2013-05-01T18:14:58.980 に答える