13

文字列のグローバル&静的テーブルを作成するC++での正しい方法は何ですか?

「グローバル」とは、ヘッダーを含む任意のファイルから使用できることを意味します。ただし、実行時に作成されたシングルトン オブジェクトの一部ではありません。

「静的」とは、実行時間の設定が可能な限り少ないことを意味します。読み取り専用メモリ ページのデータ。アプリごとに 1 つのデータ インスタンスのみ。

「文字列」とは、つまり、ヌルで終了する文字の配列は問題ありません。std::string はいいでしょうが、上記の点ではできないと思います。正しい?

「テーブル」とは、インデックス可能な配列を意味します。したがって、テーブル自体ではないと思います。しかし、私はこの点で柔軟です。アイデアを受け入れる。

「C++」とは、C ではなく C++ を意味します (更新: C++11 ではなく C++98)。

4

4 に答える 4

10

文字列.h

extern const char* table[];

文字列.cpp

const char* table[] = {
    "Stack",
    "Overflow",
}

ルックアップテーブルのエラーコードを使用して、これを別の方法で使用します。

err.h

#define ERR_NOT_FOUND    0x1004
#define ERR_INVALID      0x1005

bool get_err_msg(int code, const char* &msg);

err.cpp

typedef struct {
    int errcode;
    const char* msg;
} errmsg_t;

static errmsg_t errmsg_table[] = {
    {ERR_NOT_FOUND, "Not found"},
    {ERR_INVALID,   "Invalid"}
};

#define ERRMSG_TABLE_LEN  sizeof(errmsg_table)/sizeof(errmsg_table[0])

bool get_err_msg(int code, const char* &msg){
    msg = NULL;
    for (int i=0; i<ERRMSG_TABLE_LEN; i++) {
        if (errmsg_table[i].errcode == code) {
            msg = errmsg_table[i].msg;
            return true;
        }
    }
    return false;
}

main.cpp

#include <stdio.h>
#include "err.h"

int main(int argc, char** argv) {
    const char* msg;
    int code = ERR_INVALID;
    if (get_err_msg(code, msg)) {
        printf("%d: %s\n", code, msg);
    }
    return 0;
}

これを行うにはもっと C++ の方法があると確信していますが、私は実際には C プログラマーです。

于 2013-01-08T04:58:44.437 に答える
6

std::array文字列リテラルの a を使用します。コンストラクタがないため、C 配列のようにセクションに静的にロードされます.rodataが、標準の C++ ライブラリ インターフェイスがあります。(イテレータ、サイズなど)

ああ

#include <array>

extern std::array<const char*, 3> A;

A.cpp :

std::array<const char*, 3> A = { "foo", "bar", "baz" };

http://en.cppreference.com/w/cpp/container/array

于 2013-01-08T04:58:24.827 に答える
3

table_n少なくともそれがどれほど大きいかについてのヒントを確実に得るために厳密に提供されます:

Table.h

// header file
extern const size_t table_n;
extern const char* table[];

Table.cpp

// c/cpp file
const char *table[] = 
{
     "one",
     "two",
     "there"
};

const size_t table_n = sizeof(table)/sizeof(table[0]);

またはそのようなもの。

于 2013-01-08T05:04:06.790 に答える